feat: scripts

This commit is contained in:
2025-04-05 16:57:26 +08:00
parent bd4fe63cdc
commit 3e996ffab3
62 changed files with 4905 additions and 0 deletions

9
scripts/aes.js Normal file
View File

@@ -0,0 +1,9 @@
#! /usr/bin/env runjs
var AESCrypt = Packages.me.hatter.tools.commons.security.crypt.AESCrypt;
var main = () => {
AESCrypt.main($ARGS);
};
main();

105
scripts/async.js Normal file
View File

@@ -0,0 +1,105 @@
#! /usr/bin/env runjs
var Thread = java.lang.Thread;
var Runtime = java.lang.Runtime;
var argsjs = require('component-args.js');
var jsonjs = require('component-json-ex.js');
var printHelp = () => {
println('async.js [options] <id>');
println();
println('-h, --help Print help');
println('-i, --interval Time every refresh, default 1 (s)');
println('-t, --token Token, default read from ~/.jssp/config/asyncjs.token');
return;
};
var main = () => {
var args = argsjs.parseDefARGs(['h', 'help']);
if (args.flg('h', 'help')) {
printHelp();
return;
}
if (args.length < 1) {
xprintln('[ERROR] Target id and filename is not assigned.');
printHelp();
return;
}
var id = args[0];
var interval = args.val('i', 'interfal') || 1;
var token = args.val('t', 'token');
if (token == null) {
var tokenFile = $$.file('~/.jssp/config/asyncjs.token');
if (tokenFile.exists()) { token = $$.rFile(tokenFile).string().trim(); }
}
if (token == null) {
xprintln('[ERROR] Token is not assigned!');
return;
}
var getResultStr = $$.httpRequest().url('https://playsecurity.org/editItem.jsonp').post($$.keyValues()
.kv('token', token)
.kv('id', id)
.kv('act', 'GET')
.join()).toString();
var getResultJSON = JSON.parse(getResultStr);
if (getResultJSON.status != 200) {
xprintln('[ERROR] Get item failed: ' + getResultStr);
return;
}
var fn = getResultJSON.data.fileName;
var body = getResultJSON.data.body;
var localFile = $$.file(id + '_' + fn);
if (localFile.exists()) {
xprintln('[ERROR] File exists: ' + localFile);
return;
}
$$.rFile(localFile).write(body);
xprintln('[OK] Write file success: ' + localFile);
Runtime.getRuntime().addShutdownHook(new Thread(() => {
xprintln('[INFO] Watch ended: ' + localFile);
}));
var localFileLastModifiled = localFile.lastModified();
xprintln('[INFO] Last modified: ' + localFileLastModifiled);
xprintln('[INFO] Watching thread is running...');
while (true) {
$$.sleep(500);
var modified = localFile.lastModified();
if (modified > localFileLastModifiled) {
var now = $$.date().millis();
if ((now - modified) < 100) { $$.sleep(100); }
var secs = '' + $$.num(modified).sub(localFileLastModifiled).divr(1000, 0, null);
xprintln('[INFO] File last modified updated: '
+ localFileLastModifiled + ' -> ' + modified
+ ', diff: '
+ repeat(' ', (6 - secs.length)) + secs + ' s');
var putResultStr = $$.httpRequest().url('https://playsecurity.org/editItem.jsonp').post($$.keyValues()
.kv('token', token)
.kv('id', id)
.kv('act', 'PUT')
.kv('body', $$.rFile(localFile).string())
.join()).toString();
var putResultJSON = JSON.parse(putResultStr);
if (getResultJSON.status != 200) {
xprintln('[ERROR] Put item failed: ' + getResultStr); // STOP ?
} else {
xprintln('[OK] Put item successed!')
}
localFileLastModifiled = modified;
}
}
};
main();

9
scripts/base58.js Normal file
View File

@@ -0,0 +1,9 @@
#! /usr/bin/env runjs
var Base58Tool = Packages.me.hatter.tools.commons.tool.Base58Tool;
var main = () => {
Base58Tool.main($ARGS);
};
main();

250
scripts/build-util.js Normal file
View File

@@ -0,0 +1,250 @@
#! /usr/bin/env runjs
var argsEx = require('component-args.js');
var jsonEx = require('component-json-ex.js');
var System = java.lang.System;
var OSUtil = Packages.me.hatter.tools.commons.os.OSUtil;
var jdkPackageBaseURL = 'http://publicbucket-1251781687.coscd.myqcloud.com/';
var jdkPackages = [
{
'jdk': 'jdk-7u80-linux-x64.tar.gz',
'sha256': 'bad9a731639655118740bee119139c1ed019737ec802a630dd7ad7aab4309623'
}, {
'jdk': 'jdk-8u121-linux-x64.tar.gz',
'sha256': '97e30203f1aef324a07c94d9d078f5d19bb6c50e638e4492722debca588210bc'
}, {
'jdk': 'jdk-9.0.4_linux-x64_bin.tar.gz',
'sha256': '90c4ea877e816e3440862cfa36341bc87d05373d53389ec0f2d54d4e8c95daa2'
}
];
var printHelp = () => {
println('build-util.js <FLAGS>');
println();
println('-h, --help Print help');
println(' --init Init build.json');
println(' --init-java Init Java config');
println(' --list List Java versions');
println(' --list-jdks List JDK packages');
return;
};
var initBuildJSON = () => {
var buildGradle = $$.file('build.gradle');
var buildJSON = $$.file('build.json');
if ((buildGradle.exists()) && (buildJSON.exists())) {
xprintln('[ERROR] File build.gradle and build.json exists.');
}
print('Input project name: ');
var projectName = System.console().readLine();
if (!(projectName)) {
xprintln('[ERROR] Project name cannot be empty.');
return;
}
print('Select Java(1.6, 1.7, 1.8, 9.0, default 1.8): ');
var javaVersion = System.console().readLine();
javaVersion = $STR(javaVersion || '1.8');
if (!(['1.6', '1.7', '1.8', '9.0'].contains(javaVersion))) {
xprintln('[ERROR] Unknow java version: ' + javaVersion);
return;
}
print('Select Builder(ant, gradle, maven, default gradle): ');
var builder = System.console().readLine();
builder = $STR(builder || 'gradle');
if (!(['ant', 'gradle', 'maven'].contains(builder))) {
xprintln('[ERROR] Unknow builder: ' + builder);
return;
}
var builderVersion;
if ($STR(builder) == 'ant') {
builderVersion = '1.7';
} else if ($STR(builder) == 'maven') {
print('Select Maven(2.2.1, 3.5.2, default 3.5.2): ');
builderVersion = System.console().readLine();
builderVersion = $STR(builderVersion || '3.5.2');
if (!(['2.2.1', '3.5.2'].contains(builderVersion))) {
xprintln('[ERROR] Unknow builder version: ' + builderVersion);
return;
}
} else {
print('Select Gradle(1.0, 3.1, default 3.1): ');
builderVersion = System.console().readLine();
builderVersion = $STR(builderVersion || '3.1');
if (!(['1.0', '3.1'].contains(builderVersion))) {
xprintln('[ERROR] Unknow builder version: ' + builderVersion);
return;
}
}
println('[INFO] Name : ' + projectName);
println('[INFO] Java : ' + javaVersion);
println('[INFO] Builder : ' + builder + '/' + builderVersion);
if ($STR(builder) == 'ant') {
xprintln('[ERROR] Ant currently is not supported!!!');
return;
}
if (($STR(builder) == 'gradle') && (!(buildGradle.exists()))) {
xprintln('[INFO] Create file: ' + buildGradle.getName());
var buildGradleContent = $$.httpRequest().skipCertCheck().url('https://repo.examp1e.org/attachment/build.gradle').get().string();
buildGradleContent = buildGradleContent.replace('//BASE_PROJECT_NAME//', projectName);
buildGradleContent = buildGradleContent.replace('//SOURCE_COMPATIBILITY//', javaVersion);
buildGradleContent = buildGradleContent.replace('//TARGET_COMPATIBILITY//', javaVersion);
buildGradleContent = buildGradleContent.replace('//JAVA_COMPILE//', ((builderVersion == '1.0') ? 'Compile' : 'JavaCompile'));
print('Use maven repo(Y/N)? ');
var useMavenRepo = System.console().readLine();
if ($STR(useMavenRepo).toLowerCase() == 'y') {
buildGradleContent = buildGradleContent.replace(/\/\/DISABLE_MVN_REPO\/\/ /g, '');
}
$$.rFile(buildGradle).write(buildGradleContent);
}
if (!(buildJSON.exists())) {
xprintln('[INFO] Create file: ' + buildJSON.getName());
var bJSON = {
'java': javaVersion,
'builder': {
'name': builder,
'version': builderVersion
}
};
$$.rFile(buildJSON).write(jsonEx.prettyJSON(bJSON));
}
if (($STR(builder) == 'gradle')) {
print('Need init app(Y/N)? ');
var initApp = System.console().readLine();
if ($STR(initApp).toLowerCase() == 'y') {
$$.shell().inheritIO().commands('runjs', '-u', 'https://repo.examp1e.org/app/build.js', 'initapp').run();
}
}
if ($$.file('src').exists()) {
print('Need init eclipse(Y/N)? ')
var initEclipse = System.console().readLine();
if ($STR(initEclipse).toLowerCase() == 'y') {
if (($STR(builder) == 'gradle') && $$.file('build.gradle').exists()) {
$$.shell().inheritIO().commands('runjs', '-u', 'https://repo.examp1e.org/app/build.js', 'eclipse').run();
}
if (($STR(builder) == 'maven') && $$.file('pom.xml').exists()) {
$$.shell().inheritIO().commands('runjs', '-u', 'https://repo.examp1e.org/app/build.js', 'eclipse:eclipse').run();
}
}
}
var gitignore = $$.file('.gitignore');
if (!(gitignore.exists())) {
print('Need create .gitignore(Y/N)? ')
var createGitIgnore = System.console().readLine();
if ($STR(createGitIgnore).toLowerCase() == 'y') {
var defaultGitIgnore = [
'build',
'classes',
'.DS_Store',
'.gradle',
'.classpath',
'.project',
'.settings'
];
$$.rFile(gitignore).write(defaultGitIgnore.join('\n'));
}
}
xprintln('[SUCCESS] Done!');
};
var getBuildConfigJSON = () => {
return $$.file('~', '.jssp', 'config', 'buildconfig.json');
};
var getCurrentJavaHome = () => {
var javaHome = $$.prop('java.home');
var javaHomeFile = $$.file(javaHome);
if ($STR(javaHomeFile.getName()) == 'jre') {
if ($$.file(javaHomeFile.getParentFile(), 'bin', 'java').exists()) {
javaHome = javaHomeFile.getParentFile().getAbsolutePath();
}
}
return javaHome;
};
var initJavaVersion = () => {
var javaVersion = $$.prop('java.version');
var javaHome = getCurrentJavaHome();
var buildConfig = getBuildConfigJSON();
var buildConfigJSON = JSON.parse((buildConfig.exists() && $$.rFile(buildConfig).string()) || '{}');
if (buildConfigJSON['java'] && buildConfigJSON['java'][javaVersion]) {
xprintln('[WARN] Java config exists.');
xprintln('[INFO] Configed JAVA_HOME path: ' + buildConfigJSON['java'][javaVersion]['home']);
return;
}
println('[INFO] Current Java version : ' + javaVersion);
println('[INFO] Current JAVA_HOME : ' + javaHome);
print('Add Current Java to build config(Y/N)?');
var addJava = System.console().readLine();
if ($STR(addJava).toLowerCase() == 'y') {
buildConfigJSON['java'] = buildConfigJSON['java'] || {};
buildConfigJSON['java'][javaVersion] = buildConfigJSON['java'][javaVersion] || {};
buildConfigJSON['java'][javaVersion]['home'] = javaHome;
buildConfigJSON['java']['versions'] = buildConfigJSON['java']['versions'] || [];
buildConfigJSON['java']['versions'].push(javaVersion);
$$.rFile(buildConfig).write(jsonEx.prettyJSON(buildConfigJSON));
}
};
var main = () => {
var args = argsEx.parseARGS(['h', 'help', 'init', 'init-java', 'list', 'list-jdks']);
if (args.flags.flg('init')) {
initBuildJSON();
} else if (args.flags.flg('init-java')) {
if (OSUtil.isMacOS()) {
xprintln('[WARN] macOS DO NOT need init java, build.js will use /usr/libexec/java_home.');
} else {
initJavaVersion();
}
} else if (args.flags.flg('list-jdks')) {
println('Dowload base URL: ' + jdkPackageBaseURL);
jdkPackages.forEach((jdk) => {
println(' ' + jdk.jdk + repeat(' ', (30 - jdk.jdk.length)) + ' - ' + jdk.sha256);
});
} else if (args.flags.flg('list')) {
if (OSUtil.isMacOS()) {
$$.shell().inheritIO().commands('/usr/libexec/java_home', '-V').run();
} else {
var buildConfig = getBuildConfigJSON();
if (!(buildConfig.exists())) {
xprintln('[ERROR] build config file not found.');
return;
}
var buildConfigJSON = JSON.parse($$.rFile(buildConfig).string());
if (buildConfigJSON['java'] && buildConfigJSON['java']['versions']) {
var versions = buildConfigJSON['java']['versions'].sort();
println('Matching Java Virtual Machines (' + versions.length + '):');
versions.forEach((v) => {
println(' ' + v + ': ' + buildConfigJSON['java'][v]['home']);
});
}
println();
println(getCurrentJavaHome());
}
} else {
if (!(args.flags.flg('h', 'help'))) {
xprintln('[ERROR] Args error!');
println();
}
printHelp();
}
};
main();

260
scripts/build.js Normal file
View File

@@ -0,0 +1,260 @@
#!/usr/bin/env runjs
var Integrity = Packages.me.hatter.tools.commons.security.digest.Integrity;
var counter = require('component-counter.js');
var javahomejs = require('component-javahome.js');
var colorprint = require('component-colorprint-ex.js');
var doGetPackage = (name, bin, version) => {
var gradleHome = '~/.jssp/builder/' + name + '-' + version;
var gradleInfoRFile = __.rfile.from(gradleHome).file('info.json');
if (gradleInfoRFile.exists()) {
return gradleInfoRFile.parseJSON();
}
if (__.rfile.from(gradleHome).notExists()) { __.rfile.from(gradleHome).file().mkdirs(); }
var toolPackageDetail = $$.httpRequest().url('https://hatter.ink/tool/tool_package_detail.jsonp')
.param('__auth_token', 'GpsVz8uxoxFW34CFhyGnTwKXQRtL3FoTA')
.param('name', name)
.param('version', version)
.get();
var toolPackageDetailJSON = JSON.parse(toolPackageDetail.toString());
if (toolPackageDetailJSON.status != 200) {
return null;
}
var packageName = toolPackageDetailJSON.data.name;
if (packageName.endsWith('.zip')) { packageName = packageName.substring(0, packageName.length - 4); }
else if (packageName.endsWith('.tgz')) { packageName = packageName.substring(0, packageName.length - 4); }
else if (packageName.endsWith('.tar.gz')) { packageName = packageName.substring(0, packageName.length - 7); }
if (packageName.endsWith('-bin')) { packageName = packageName.substring(0, packageName.length - 4); }
var gradleInfoJSON = {
'package': toolPackageDetailJSON.data.url,
'sha256': Integrity.parse(toolPackageDetailJSON.data.integrity).getDigest().asHex(),
'path': gradleHome + '/' + packageName,
'bin': bin
};
gradleInfoRFile.write(JSON.stringify(gradleInfoJSON));
return gradleInfoJSON;
};
var builders = {
'ant': {
'1.7': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/ant1.7.tar.gz',
//'package': 'https://playsecurity.org/getdoc/1248_A7AA5F48FD4AD6CC21731D6DA7412028/ant1.7.tar.gz',
'sha256': 'fb91927e662d415b6d377434a79b9ba416295d5b27c7cfdee651016e103d933f',
'path': '~/.jssp/builder/ant-1.7/ant1.7',
'bin': 'bin/ant'
},
'@system': {
'bin': 'ant'
}
},
'gradle': {
'1.0': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-1.0-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1319_8CF093FD477F8C991C586A3FF1DDAC53/gradle-1.0-bin.zip',
'sha256': '894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384',
'path': '~/.jssp/builder/gradle-1.0/gradle-1.0',
'bin': 'bin/gradle'
},
'3.1': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-3.1-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1250_66CED6B096F6BF7C88F718F2FDFA17DD/gradle-3.1-bin.zip',
'sha256': 'c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc',
'path': '~/.jssp/builder/gradle-3.1/gradle-3.1',
'bin': 'bin/gradle'
},
'4.4': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-4.4-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1400_ECE7856BD68513DE9BF6E8D66990443F/gradle-4.4-bin.zip',
'sha256': 'fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f',
'path': '~/.jssp/builder/gradle-4.4/gradle-4.4',
'bin': 'bin/gradle'
},
'getPackage': (version) => {
return doGetPackage('gradle', 'bin/gradle', version);
},
'@system': {
'bin': 'gradle'
}
},
'maven': {
'2.2.1': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/apache-maven-2.2.1-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1422_ABA87C5E2BD1C06F8DD898CFF67E3BDB/apache-maven-2.2.1-bin.zip',
'sha256': 'a509c03f10ba8c7c503338c0870ae9abbb59cb06279f705d12f69b454c8cf6a1',
'path': '~/.jssp/builder/maven-2.2.1/apache-maven-2.2.1',
'bin': 'bin/mvn'
},
'3.5.2': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/apache-maven-3.5.2-bin.zip',
//'package': 'https://playsecurity.org/getdoc/1421_182A3E008816352359E0690E14BD2C10/apache-maven-3.5.2-bin.zip',
'sha256': '90e9f0d700743516d1f610fcd63a5d49751d0743db713909f9ef933747a38b8a',
'path': '~/.jssp/builder/maven-3.5.2/apache-maven-3.5.2',
'bin': 'bin/mvn'
},
'getPackage': (version) => {
return doGetPackage('maven', 'bin/mvn', version);
},
'@system': {
'bin': 'mvn'
}
}
};
var getBuildJSONInParents = (buildJSONFile) => {
var f = buildJSONFile.getAbsoluteFile();
while (f.getParentFile() != null) {
f = f.getParentFile();
if ($$.file(f, 'build.json').exists()) {
return $$.file(f, 'build.json');
}
}
return null;
};
var main = () => {
var buildJSONFile = $$.file('build.json');
if (!buildJSONFile.exists()) {
xprintln('[WARN] Build config file not found in current dir: build.json');
buildJSONFile = getBuildJSONInParents(buildJSONFile);
if (buildJSONFile == null) {
xprintln('[ERROR] Build config file not found: build.json');
return;
}
}
var buildJSON = JSON.parse($$.rFile(buildJSONFile).string());
var builderInfo = buildJSON.builder || buildJSON.compiler;
var javaVersion = buildJSON.java;
if (!javaVersion) { xprintln('[ERROR] Java version is not assigned!'); return; }
if (!builderInfo) { xprintln('[ERROR] Builder info is not assigned!'); return; }
var builder = builders[builderInfo['name']][builderInfo['version']];
if ((builder == null) && builders[builderInfo['name']].getPackage) {
builder = builders[builderInfo['name']].getPackage(builderInfo['version']);
}
if (!builder) { xprintln('[ERROR] Builder version not found: ' + builderInfo['name'] + '-' + builderInfo['version']); return; }
var builderBin = (builderInfo['version'] == '@system') ? builder.bin : (builder.path + '/' + builder.bin);
if (builderBin.startsWith('~')) {
builderBin = $$.prop('user.home') + builderBin.substring(1);
}
var javaHome = null;
if ($STR(javaVersion) != '@system') { // TODO ...
javaHome = javahomejs.getJavaHome(javaVersion);
if (javaHome == null) {
xprintln('[ERROR] Java version is not found: ' + javaVersion);
return;
}
}
var commandArgs = [];
var buildCommands = [];
buildCommands.push(builderBin);
if (buildJSON.args) {
buildJSON.args.forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
}
var hasXArgsNotMatch = false;
var hasXRunsNotMatch = false;
$ARR($ARGS).forEach((a) => {
if ($STR(a).startsWith('::')) {
var aCmd = $STR(a).substring(2);
if (buildJSON.xArgs && buildJSON.xArgs[aCmd]) {
buildJSON.xArgs[aCmd].forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
return; // process next argument!
} else {
hasXArgsNotMatch = true;
xprintln('[WARN] xArgs "build.json#xArgs#' + aCmd + '" not found!');
}
} else if ($STR(a).startsWith('...')) {
buildCommands = [];
var aCmd = $STR(a).substring(3);
if (buildJSON.xRuns && buildJSON.xRuns[aCmd]) {
buildJSON.xRuns[aCmd].forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
return; // process next argument!
} else {
hasXRunsNotMatch = true;
xprintln('[ERROR] xRuns "build.json#xRuns#' + aCmd + '" not found!');
}
}
buildCommands.push(a); commandArgs.push(a);
});
if (hasXArgsNotMatch && ($ARRAY($ARGS).length == 1)) {
print('xArgs argument not found, do you want to continue(yes/no, default no)? ');
var yesNo = java.lang.System.console().readLine();
yesNo = $STR(yesNo || 'no').toLowerCase();
if (!(['yes', 'y'].contains(yesNo))) {
xprintln('[INFO] Exited.')
return;
}
}
if (hasXRunsNotMatch) {
return;
}
if ((builderInfo['version'] != '@system') && (!($$.file(builderBin).exists()))) {
xprintln('[INFO] Builder not exists, downloading...');
var nameAndVersion = builderInfo['name'] + '-' + builderInfo['version'];
var fn = builder.package.substring(builder.package.lastIndexOf('/') + 1);
if (fn.indexOf('?') > 0) { fn = fn.substring(0, fn.indexOf('?')); }
var f = $$.file('~', '.jssp', 'builder', nameAndVersion, fn);
if (!(f.exists())) {
f.getParentFile().mkdirs();
var fos = new java.io.FileOutputStream(f);
$$.httpRequest()
.url(builder.package)
.addHeader('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36')
.get(fos, counter.getCounter2());
fos.close();
println();
var sha256 = $$.rFile(f).digest($$.digests().sha256()).asHex();
if ($STR(sha256) == builder.sha256) {
xprintln('[SUCCESS] Check SHA256 success.')
} else {
xprintln('[ERROR] Check SHA256 failed, actual is: ' + sha256 + ',expected: ' + builder.sha256);
f.renameTo($$.file('~', '.jssp', 'builder', nameAndVersion, fn + '.invalid.' + $$.date().millis()));
return;
}
// installBuilderScripts.push('runjs -u https://repo.examp1e.org/app/get.js ' + builder.package);
}
var installBuilderScripts = [];
installBuilderScripts.push('cd ~/.jssp/builder/' + nameAndVersion);
if (/.*\.tar\.gz$/.test(fn) || /.*\.tgz$/.test(fn)) {
installBuilderScripts.push('tar xzvf ' + fn);
} else if (/.*\.zip$/.test(fn)) {
installBuilderScripts.push('unzip ' + fn);
} else {
xprintln('[ERROR] Extract package failed: ' + fn);
return;
}
installBuilderScripts.push('');
var builderIntall = $$.file('.builder_install.sh');
$$.rFile(builderIntall).write(installBuilderScripts.join('\n'));
$$.shell().inheritIO().commands('sh', builderIntall.getName()).run();
builderIntall.delete();
}
if ((builderInfo['version'] != '@system') && (!($$.file(builderBin).exists()))) {
xprintln('[ERROR] Builder bin not found!');
return;
}
xprintln('[INFO] JAVA_HOME = ' + (javaHome || ($$.env('JAVA_HOME') + colorprint.okgreen.render(' @system'))));
xprintln('[INFO] BUILDER = ' + builderBin + ((builderInfo['version'] == '@system') ? colorprint.okgreen.render(' @system') : ''));
xprintln('[INFO] ARGUMENTS = ' + $ARR(commandArgs).toJavaList());
println();
var shell = $$.shell();
if (javaHome) { shell.env('JAVA_HOME', javaHome).env('PATH', javaHome + '/bin:' + $$.env('PATH')); }
shell.inheritIO().commands(buildCommands).run();
};
main();

13
scripts/cal.js Normal file
View File

@@ -0,0 +1,13 @@
#! /usr/bin/env runjs
var main = () => {
if ($STR(__.environment.getOS().name()) == 'MacOS') {
// macOS
$$.shell().inheritIO().commands('cal', '-A', '1', '-B', '1').run();
} else {
// Linux
$$.shell().inheritIO().commands('cal', '-3').run();
}
};
main();

View File

@@ -0,0 +1,70 @@
#! /usr/bin/env runjs
var colorPrint = require('component-colorprint-ex.js');
var checkResultList = [];
var getArchiveInfo = (gid, aid) => {
var archiveInfo = __.httprequest
.fromUrl('https://hatter.ink/repo/archive_info.jsonp')
.param('__auth_token', 'r7dyCJpant4VFs5vqQSphEBEEqNBXqSBiFPPG7Nz6')
.param('gid', gid)
.param('aid', aid)
.get();
return JSON.parse($STR(archiveInfo));
};
var checkNewestVersion = (printedLen, gid, aid, ver) => {
var printS = (79 - printedLen);
printS = ((printS < 0)? 0: printS) + 1;
print(printS.repeat(' ').join(''));
var archiveInfo = getArchiveInfo(gid, aid);
if (archiveInfo.data == null) {
println('-');
} else {
if (archiveInfo.data.latestVersion == ver) {
println(colorPrint.okgreen.render('OK'));
} else {
println(colorPrint.warning.render('NG') + ' ' + colorPrint.okgreen.render('-> ' + archiveInfo.data.latestVersion));
checkResultList.push([gid, aid, ver].join(':') + ' -> ' + archiveInfo.data.latestVersion);
}
}
};
var main = () => {
var outs = $$.shell().commands('build.js', '-q', 'dependencies', '--configuration', 'compile').mergeError().start();
var out = outs[0];
var lines = $STR(out).split(/\n/);
lines.forEach((ln) => {
var indexOfSSS = ln.indexOf('--- ');
if (indexOfSSS >= 0) {
print(ln);
if (ln.indexOf('(*)') >= 0) {
println();
} else {
var gidAidVerAndMore = ln.substring(indexOfSSS + 3).trim();
var gid = gidAidVerAndMore.split(':')[0];
var aid = gidAidVerAndMore.split(':')[1];
var ver = gidAidVerAndMore.split(':')[2];
if (gidAidVerAndMore.indexOf('->') >= 0) {
ver = gidAidVerAndMore.split('->')[1].trim();
}
checkNewestVersion(ln.length, gid, aid, ver);
}
} else {
println(ln);
}
});
if (checkResultList.length > 0) {
xprintln('[WARN] Check result:\n' + checkResultList.join('\n'));
}
};
main();

125
scripts/checkgitlabtodo.js Normal file
View File

@@ -0,0 +1,125 @@
#! /usr/bin/env runjs
var argsjs = require('component-args.js');
var timejs = require('component-time.js');
var dingtalkrobotjs = require('component-dingtalkrobot-ex.js');
// curl --header "Private-Token: xxxxxxxxxxxxx" https://gitlab.com/api/v4/users/jht5945/projects | viewjson.js
// curl --header "Private-Token: xxxxxxxxxxxxx" https://gitlab.com/api/v4/projects/5327754/issues?state=opened | viewjson.js
// https://gitlab.com/help/api/projects.md
// https://gitlab.com/help/api/issues.md
var sampleConfig = {
"default": {
"dailyCheckHour": 9,
"checkNewItems": true,
"privateToken": "xxxxxxxxxxxxx",
"dingtalkRobotToken": "xxxxxxxxxxxxxxxxxxxxxx"
},
"list": [{
"projectId": 5327754,
"dailyCheckHour": 9,
"checkNewItems": true,
"privateToken": "xxxxxxxxxxxxx",
"dingtalkRobotToken": "xxxxxxxxxxxxxxxxxxxxxx",
"messageFootNote": "https://gitlab.com/xxxxxxx/xxxxxxxxxxxxx/issues"
}]
};
var issueToString = (issue) => {
var createdAt = $$.date().fmt('yyyy-MM-dd\'T\'HH:mm:ss.SSSXXX').parse(issue.created_at);
var it = [' - ', issue.title];
it.push(' (' + timejs.formatDuration(createdAt.getTime()) + ')');
if (issue.labels && issue.labels.length > 0) {
it.push(' [' + issue.labels.join(', ') + ']');
}
if (issue.due_date) {
it.push(', due: ' + timejs.formatDueInDays($$.date().fmt('yyyy-MM-dd').parse(issue.due_date)));
}
if (issue.weight != null) {
it.push(', weight: ' + issue.weight);
}
return it.join('');
};
var main = () => {
var args = argsjs.parseDefARGs();
var config = $$.file(args[0] || '~/.gitlab_todo_config.json');
if (!(config.exists())) {
xprintln('[ERROR] config file not exists: ' + args[0]);
return;
}
var configJSON = JSON.parse($$.rFile(config).string() || '{}');
var defaultConfig = configJSON['default'];
var configList = configJSON['list'] || [];
configList.forEach((config) => {
var startMillis = $$.date().millis();
xprintln('[INFO] Check project, id: ' + config.projectId);
var localConfigPath = $$.file('~/.jssp/gitlab_todo/localconfig');
if (!(localConfigPath.exists())) { localConfigPath.mkdirs(); }
var projectLocalConfig = $$.file(localConfigPath, 'config_' + config.projectId + '.json');
var projectLocalConfigJSON = {};
if (projectLocalConfig.exists()) { projectLocalConfigJSON = JSON.parse($$.rFile(projectLocalConfig).string()); }
var doDailyCheckHour = false;
var todayYMD = $STR($$.date().fmt('yyyy-MM-dd').format($$.date().today()));
var hour = $$.asInt($$.date().fmt('H').format($$.date().today()));
if (todayYMD != projectLocalConfigJSON.checkedYMD) {
if (hour == ((config.dailyCheckHour != null) ? config.dailyCheckHour : defaultConfig.dailyCheckHour)) {
doDailyCheckHour = true;
}
}
var hasNewItems = false;
var doCheckNewItems = (config.checkNewItems != null) ? config.checkNewItems : defaultConfig.checkNewItems;
xprintln('[INFO] Project config: doDailyCheckHour=' + doDailyCheckHour + ', doCheckNewItems=' + doCheckNewItems);
if (doDailyCheckHour || doCheckNewItems) { // DO CHECK
var url = 'https://gitlab.com/api/v4/projects/' + config.projectId + '/issues?state=opened';
xprintln('[INFO] Get url: ' + url);
var openedIssues = $$.httpRequest().url(url)
.header('Private-Token', config.privateToken || defaultConfig.privateToken)
.get();
var openedIssuesJSON = JSON.parse(openedIssues);
if (openedIssuesJSON && (openedIssuesJSON.length > 0)) {
if (doDailyCheckHour) {
var msg = [];
msg.push((config.title || '<untitled>') + ' (' + openedIssuesJSON.length + ' items):');
openedIssuesJSON.forEach((issue) => {
msg.push(issueToString(it));
});
if (config.messageFootNote) {
msg.push('');
msg.push(config.messageFootNote);
}
dingtalkrobotjs.sendText(config.dingtalkRobotToken || defaultConfig.dingtalkRobotToken, msg.join('\n'));
projectLocalConfigJSON.checkedYMD = todayYMD;
}
if (doCheckNewItems) {
projectLocalConfigJSON.checkedIssueIds = projectLocalConfigJSON.checkedIssueIds || [];
var newIssuesJSON = openedIssuesJSON.filter((issue) => {
return (projectLocalConfigJSON.checkedIssueIds.indexOf(issue.id) < 0);
});
if (newIssuesJSON && (newIssuesJSON.length > 0)) {
var msg = [];
msg.push('New items found (' + newIssuesJSON.length + ' items):');
newIssuesJSON.forEach((issue) => {
msg.push(issueToString(issue));
projectLocalConfigJSON.checkedIssueIds.push(issue.id);
});
hasNewItems = true;
dingtalkrobotjs.sendText(config.dingtalkRobotToken || defaultConfig.dingtalkRobotToken, msg.join('\n'));
}
}
}
if (doDailyCheckHour || (doCheckNewItems && hasNewItems)) {
$$.rFile(projectLocalConfig).write(JSON.stringify(projectLocalConfigJSON));
}
}
xprintln('[INFO] Finish check project, cost: ' + ($.date().millis() - startMillis) + 'ms');
});
};
main();

14
scripts/checkgitupdate.js Normal file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env runjs
var System = java.lang.System;
var main = () => {
var r = $STR($$.shell().commands('git', 'fetch', '--dry-run').mergeError().start()[0]);
if (r.trim().length > 0) {
System.exit(1);
}
System.exit(0);
};
main();

33
scripts/checkscripts.js Normal file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/env runjs
var argsjs = require('component-args.js');
var colorprint = require('component-colorprint-ex.js');
var main = function() {
var args = argsjs.parseDefARGs([]);
$ARR(__.rfile.from('.').file().listFiles()).forEach((f) => {
var fn = f.getName();
var fnLn = fn.length;
print('Checking: ' + fn + __.stringutil.repeat(' ', (44 - fnLn)));
if (!(f.isFile())) {
print('[SKIP]');
} else {
var fBs = __.httprequest.fromUrl('https://hatter.ink/script/get.json?nocontent=true&name=' + fn).get();
var fJson = JSON.parse(fBs.string());
if (fJson.status == 404) {
print(colorprint.bold.print('[NOT FOUND]'));
} else {
var sha1 = $STR(__.rfile.from(f).digest($$.digests().sha1()).asHex());
if (sha1 == fJson.data.sha1) {
print(colorprint.okgreen.print('[OK]'));
} else {
print(colorprint.warning.print('[NG]'));
}
}
}
println();
});
}
main();

22
scripts/cmd.js Normal file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env runjs
var DefaultRollCounter = Packages.me.hatter.tools.commons.io.DefaultRollCounter;
var cmdRFile = __.rfile.from('~/.jssp/cache/cmd.jar');
var cmdUrl = 'https://a.hatter.ink/cmd.jar';
if (cmdRFile.notExists()) {
var bs = $$.httpRequest().url(cmdUrl).get(new DefaultRollCounter().prefix('Downloading ... '));
cmdRFile.write(bs);
}
requireJAR('file://' + cmdRFile.file());
var JarLauncher = Packages.org.springframework.boot.loader.JarLauncher;
var main = () => {
JarLauncher.main($ARGS);
};
main();

53
scripts/convertcsv2xls.js Normal file
View File

@@ -0,0 +1,53 @@
#! /usr/bin/env runjs
requireJAR('commons-csv-1.4.jar');
requireJAR('poi-3.15.jar');
var FileOutputStream = java.io.FileOutputStream;
var StringUtil = Packages.me.hatter.tools.commons.string.StringUtil;
var CSVParser = Packages.org.apache.commons.csv.CSVParser;
var CSVFormat = Packages.org.apache.commons.csv.CSVFormat;
var HSSFWorkbook = Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook;
var HSSFSheet = Packages.org.apache.poi.hssf.usermodel.HSSFSheet;
var HSSFRow = Packages.org.apache.poi.hssf.usermodel.HSSFRow;
var HSSFCell = Packages.org.apache.poi.hssf.usermodel.HSSFCell;
var Cell = Packages.org.apache.poi.ss.usermodel.Cell;
var main = () => {
if ($ARGS == null || $ARGS.length == 0) {
println('convertcsv2xls.js - Convert CSV to Excel.')
println();
println('ERROR: NO arguments assigned!');
println('convertcsv2xls.js filename.csv [filename.xls]');
return;
}
var csvFile = $$.file($ARGS[0]);
if (!csvFile.exists()) {
println('[ERROR] File not exists: ' + $ARGS[0]);
return;
}
var xlsFile = ($ARGS.length > 1)? $ARGS[1]: (StringUtil.substringBeforeLast(csvFile.getName(), '.') || csvFile.getName()) + '.xls';
var book = new HSSFWorkbook();
var sheet = book.createSheet('new sheet');
println('Read CSV file: ' + csvFile);
var parser = CSVParser.parse(csvFile, $$.charset('UTF-8'), CSVFormat.EXCEL);
$EACH(parser, (record, index) => {
println('Write excel row: ' + index);
var row = sheet.createRow(index);
$EACH(record, (item, cellIndex) => {
var cell = row.createCell(cellIndex);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue($$.str(item));
});
});
println('Write excel file: ' + xlsFile);
var fout = new FileOutputStream(xlsFile);
book.write(fout);
fout.close();
};
main();

70
scripts/createproject.js Normal file
View File

@@ -0,0 +1,70 @@
#!/usr/bin/env runjs
var argsjs = require('component-args.js');
printUsage = () => {
println('createproject.js springboot|jar');
};
createDirs = () => {
__.rfile.from('src/main/java').file().mkdirs();
__.rfile.from('src/main/resources').file().mkdirs();
__.rfile.from('src/test/java').file().mkdirs();
__.rfile.from('src/test/resources').file().mkdirs();
};
createFileGitignore = () => {
var gitignores = [
'build',
'classes',
'.DS_Store',
'.gradle',
'.classpath',
'.project',
'.settings',
'*.iml',
'*.ipr',
'*.iws'
];
__.rfile.from('.gitignore').write(gitignores.join('\n'));
};
createProject = (gradleFn) => {
var buildJsonRFile = __.rfile.from('build.json');
var buildGradleRFile = __.rfile.from('build.gradle');
if (buildJsonRFile.exists() || buildGradleRFile.exists()) {
xprintln('[ERROR] File build.json or build.gradle exists.');
return;
}
xprintln('[INFO] Get build.json');
var buildJsonBs = __.httprequest.fromUrl('https://hatter.ink/script/get.action?name=build.json').get();
xprintln('[INFO] Get build.gradle')
var buildGradleBs = __.httprequest.fromUrl('https://hatter.ink/script/get.action?name=' + gradleFn).get();
buildJsonRFile.write(buildJsonBs);
buildGradleRFile.write(buildGradleBs);
createDirs();
createFileGitignore();
};
main = () => {
var args = argsjs.parseDefARGs([]);
if ((args == null) || (args.length == 0)) {
printUsage();
return;
}
if (args[0] == 'springboot') {
createProject('build_springboot_template.gradle');
} else if (args[0] == 'jar') {
createProject('build_jar_template.gradle');
} else {
xprintln('[WARN] Unknown commant: ' + args[0]);
}
};
main();
// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20250105T215717+08:00.MEUCIQCiea2KACCkhb1/qMvnYGRKWOAzDABzM4LHYoVVousLSAIgIKvu8xkItW3FSmYMJHye9jdcIPBbRto9yGUrnIyZyIs=

86
scripts/createrunjs.js Normal file
View File

@@ -0,0 +1,86 @@
#!/usr/bin/env runjs
var consolejs = require('component-console.js');
var filesystemjs = require('component-filesystem.js');
var RUNJS_HEAD_LINE = '#!/usr/bin/env runjs';
var RUNJS_COMPONENT_CONFIG_URL = 'https://hatter.ink/script/get_scripts.json?type=runjs-component';
var main = () => {
var runjsFn = $$.file(consolejs.readLineEx('Input your runjs filename: '));
if (runjsFn.exists()) {
xprintln('[ERROR] File exists: ' + runjsFn);
return;
}
var componentsJSON = JSON.parse($$.httpRequest().skipCertCheck().url(RUNJS_COMPONENT_CONFIG_URL).get().string());
var components = [];
componentsJSON.scripts.forEach((c, i) => {
if (!(['component-colorprint.js', 'component-diffutil.js', 'component-dingtalkrobot.js',
'component-filechooser.js', 'component-gpg.js', 'component-helloworld.js',
'component-helloworld2.js', 'component-httpserver.js', 'component-json.js',
'component-shannonentropy.js', 'component-sqlitedataaccess.js', 'component-swing.js'].contains(c))) {
components.push(c); // old js components
}
});
xprintln('[INFO] Components: ');
components.forEach((c, i) => {
var ln = repeat(' ', (3 - $STR(i).length)) + i + ': ' + c;
print(ln + repeat(' ', 60 - ln.length));
if (((i + 1) % 2) == 0) { println(); }
});
if (components.length % 2 != 0) { println(); }
var selectedComponents = consolejs.readLine('Select components(split with \',\'): ');
var componentIds = [];
$ARR(selectedComponents.split(',')).forEach((cid) => {
cid = cid.trim();
if (cid == '') { return; }
componentIds.push(parseInt(cid));
});
var isComponent = runjsFn.getName().startsWith('component-');
var selectedComponentNames = [];
var buf = [];
if (!isComponent) { buf.push(RUNJS_HEAD_LINE); }
buf.push('');
componentIds.forEach((cid) => {
var c = components[cid];
if (c == null) {
xprintln('[WARN] Component not found: ' + cid);
} else {
selectedComponentNames.push(c);
var n = c.substring('component-'.length).replace('-ex', '').replace('.js', '') + 'js';
buf.push('var ' + n + ' = require(\'' + c + '\');');
}
});
buf.push('');
if (isComponent) {
buf.push('var sample = () => {');
buf.push(' // TODO');
buf.push('}');
buf.push('');
buf.push('if (typeof exports == \'object\') {');
buf.push(' exports.sample = sample;');
buf.push('}');
buf.push('');
} else {
buf.push('var main = () => {');
if (selectedComponentNames.contains('component-args.js')) {
buf.push(' var args = argsjs.parseDefARGs([]);');
}
buf.push(' xprintln(\'[OK] Hello World!\'); // TODO');
buf.push('}');
buf.push('');
buf.push('main();');
buf.push('');
}
$$.rFile(runjsFn).write(buf.join('\n'));
if (!isComponent) { filesystemjs.chmodAddExec(runjsFn); }
xprintln('[SUCCESS] Create file success: ' + runjsFn);
};
main();

12
scripts/date.js Normal file
View File

@@ -0,0 +1,12 @@
#! /usr/bin/env runjs
var TimeZone = java.util.TimeZone;
var SimpleDateFormat = java.text.SimpleDateFormat;
var main = () => {
var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
println(sdf.format(new java.util.Date()));
};
main();

36
scripts/decrypt.js Normal file
View File

@@ -0,0 +1,36 @@
#! /usr/bin/env runjs
requireJAR('bcprov-ext-jdk15on-154.jar');
requireJAR('crypto-1.0.jar');
var FileOutputStream = Packages.java.io.FileOutputStream;
var DecryptTool = Packages.me.hatter.tools.crypto.stream.DecryptTool;
var main = () => {
if ($ARGS.length != 3) {
xprintln('[ERROR] parameter error, decrypt.js AES_KEY FILE_NAME_ENC FILE_NAME');
return;
}
var k = __.bytes.fromHex($ARGS[0]).bytes();
var encF = $$.rFile($ARGS[1]);
var dstF = $$.rFile($ARGS[2]);
if (encF.notExists()) {
xprintln('[ERROR] Enc file not exists.');
return;
}
if (dstF.exists()) {
xprintln('[ERROR] Dest file exists.');
return;
}
var is = encF.inputStream();
var dt = new DecryptTool(is, k);
var os = dstF.outputStream();
xprintln('[INFO] Descrypt ' + encF.file() + ' -> ' + dstF.file() + ' ...');
dt.decrypt(os);
os.close();
is.close();
xprintln('[OK] Decrypt file finished.');
};
main();

36
scripts/digcaa.js Normal file
View File

@@ -0,0 +1,36 @@
#! /usr/bin/env runjs
var StringUtil = Packages.me.hatter.tools.commons.string.StringUtil;
var Bytes = Packages.me.hatter.tools.commons.bytes.Bytes;
var RReader = Packages.me.hatter.tools.commons.io.RReader;
var main = () => {
if ($ARGS == null || $ARGS.length == 0) {
println('digcaa.js - Dig CAA.')
println();
println('ERROR: NO arguments assigned!');
println('digcaa.js <DOMAIN i.e. google.com>');
return;
}
var result = $$.shell().commands('dig', '+short', '-t', 'TYPE257', $ARGS[0]).start();
var out = result[0].string();
var err = result[1].string();
if ((err != null) && (err != '')) {
println('+ ERROR: ' + err)
}
$ARRAY(RReader.from(out).listAndClose())
.filter((ln) => {return (ln.trim() != '');})
.forEach((ln) => {
var ss = $$.asList(ln.split(/\s+/));
var f = ss[2].substring(0, 2);
var l = ss[2].substring(2, 4);
var p1 = ss[2].substring(4, (4 + parseInt(l, 16) * 2));
var p2 = ss[2].substring(4 + p1.length);
if (ss.size() > 3) {
for (var i = 3; i < ss.size(); i++) { p2 += ss[i]; }
}
println(ln + StringUtil.repeat(' ', 50 - ln.length) + ' --> ' + parseInt(f, 16) + ' ' + Bytes.fromHex(p1) + ' "' + Bytes.fromHex(p2) + '"');
});
};
main();

41
scripts/digestjs.js Normal file
View File

@@ -0,0 +1,41 @@
#! /usr/bin/env runjs
var hashjs = require('component-hashjs.js');
var main = () => {
var args = $ARRAY($ARGS);
if (args.length < 1) {
println('No args...');
println();
println('digestjs.js <FILE>')
return;
}
args.forEach((f) => {
var fi = $$.file(f);
if (fi.isDirectory()) { xprintln('[WARN] Skip directory: ' + fi); return; }
if (!(fi.getName().endsWith('.js'))) { xprintln('[WARN] Skip non js: ' + fi); return; }
var bytes = $$.rFile(fi).Bytes();
var list = bytes.list();
var digestJSON = hashjs.__getDigestJSON(list);
var jsSHA256Hex = hashjs.__calcSHA256Hex(list);
if (digestJSON == null) {
xprintln('[OK] Write file: ' + fi + ', SHA256: ' + jsSHA256Hex);
digestJSON = { 'SHA256': jsSHA256Hex };
list.add(hashjs.COMMENT_HASH_TAG + JSON.stringify(digestJSON));
$$.rFile(fi).write($ARR(list).join('\n'));
} else {
if (digestJSON.SHA256 == jsSHA256Hex) {
xprintln('[INFO] SHA256 matches, Skip file SHA256 update: ' + fi);
} else {
xprintln('[OK] Update file: ' + fi + ', SHA256: ' + digestJSON.SHA256 + ' >> ' + jsSHA256Hex);
digestJSON = { 'SHA256': jsSHA256Hex };
list.add(hashjs.COMMENT_HASH_TAG + JSON.stringify(digestJSON));
$$.rFile(fi).write($ARR(list).join('\n'));
}
}
});
};
main();

104
scripts/doubanbook.js Normal file
View File

@@ -0,0 +1,104 @@
#! /usr/bin/env runjs
var oss = require('component-oss.js');
var fastJSON = require('component-json-ex.js');
oss.requireJARs();
requireJAR('jsoup-1.8.1.jar');
var Jsoup = Packages.org.jsoup.Jsoup;
var IOUtil = Packages.me.hatter.tools.commons.io.IOUtil;
var KeyValue = Packages.me.hatter.tools.commons.network.HttpRequest.KeyValue;
var main = () => {
if ($ARGS.length < 1) {
println('No args!!!');
return;
}
var config = $$.rFile('~', '.jssp/config/osssendfile.json').string();
var configJSON = JSON.parse(config);
var url = $ARGS[0];
var content = $$.httpRequest().url(url).get().toString();
var doc = Jsoup.parse(content);
var title = doc.select("#wrapper h1 span").get(0).text();
var bigImg = doc.select(".subject #mainpic a").get(0).attr("href");
var smallImg = doc.select(".subject #mainpic a img").get(0).attr("src");
var bookInfo = doc.select(".subject #info").get(0).text().replaceAll("\\b([^ ]*:)", "\n$1").trim();
var bookAttrs = $$.linkedMap();
$ARR(IOUtil.readToList(bookInfo)).forEach((l) => {
l = l.trim();
var indexOfComma = l.indexOf(':');
var k = l.substring(0, indexOfComma).trim();
var v = l.substring(indexOfComma + 1).trim();
bookAttrs.put(k, v);
});
println('[INFO] Book details:');
println('Name : ' + title);
println('Big img : ' + bigImg);
println('Small img : ' + smallImg);
println('Detail info : ' + fastJSON.prettyJavaJSON(bookAttrs));
print('Confirm [Y/N]:');
var confirm = java.lang.System.console().readLine();
if (!(confirm && $STR(confirm.trim()).toLowerCase() == 'y')) {
xprintln('[ERROR] Y or y is not selected, end!');
return;
}
var uploadImg = (imgUrl) => {
println('[INFO] Send image: ' + imgUrl);
var params = $$.list();
params.add(new KeyValue('jsonp', '1'));
params.add(new KeyValue('token', configJSON.token));
params.add(new KeyValue('url', imgUrl));
params.add(new KeyValue('title', title + imgUrl.substring(imgUrl.lastIndexOf('.'))));
params.add(new KeyValue('keywords', 'Book,Image,Book Cover'));
params.add(new KeyValue('description', 'Book: ' + title + ', url: ' + url + ', detail: ' + fastJSON.prettyJavaJSON(bookAttrs)));
var res = $$.httpRequest().url('https://playsecurity.org/doc/addDoc.jsonp').post(params);
var resJSON = JSON.parse(res);
if (resJSON.status == 200) {
xprintln('[SUCCESS] Send image to doc list successed: ' + res);
} else {
xprintln('[FAIL] Send image to doc list failed: ' + res);
throw ('[FAIL] Send image to doc list failed: ' + res);
}
return 'https://playsecurity.org/getdoc/' + resJSON['id'] + '_' + resJSON['etag'] + '/' + imgUrl.substring(imgUrl.lastIndexOf('/') + 1);
};
var newSmallImg = uploadImg(smallImg);
var newBigImg = newSmallImg;
if ($STR(smallImg) != $STR(bigImg)) {
newBigImg = uploadImg(bigImg);
}
{
println('[INFO] Send book info')
var params = $$.list();
params.add(new KeyValue('jsonp', '1'));
params.add(new KeyValue('token', configJSON.token));
params.add(new KeyValue('url', url));
params.add(new KeyValue('title', title));
params.add(new KeyValue('type', ''));
params.add(new KeyValue('bigImg', newBigImg));
params.add(new KeyValue('smallImg', newSmallImg));
params.add(new KeyValue('bookInfo', $$.stringify(bookAttrs)));
var res = $$.httpRequest().url('https://playsecurity.org/book/addBook.jsonp').post(params);
var resJSON = JSON.parse(res);
if (resJSON.status == 200) {
xprintln('[SUCCESS] Send book to book list successed: ' + res);
} else {
xprintln('[FAIL] Send book to book list failed: ' + res);
throw ('[FAIL] Send book to book list failed: ' + res);
}
}
};
main();

173
scripts/enc.js Normal file
View File

@@ -0,0 +1,173 @@
#! /usr/bin/env runjs
var argsjs = require('component-args.js');
var RFile = Packages.me.hatter.tools.commons.io.RFile;
var main = () => {
var parsedArgs = argsjs.parseDefARGs([]);
var actions = ['desc', 'show', 'cat', 'edit', 'create'];
var matchAction = (parsedArgs.length == 0)? []: actions.filter((a) => { return a.startsWith(parsedArgs[0]) });
if (matchAction == 0) {
println('No or error args, usage:');
println(' enc [-k KEY_ID] desc|show|cat|edit|create');
return;
}
if (matchAction.length > 1) {
println('Match more than one action: ' + JSON.stringify(matchAction));
return;
}
parsedArgs[0] = matchAction[0];
if (parsedArgs[0] == 'desc') {
if (parsedArgs.length == 1) {
println('File name is not assigned.');
return;
}
$$.shell().commands('pgpdump', parsedArgs[1]).inheritIO().run();
return;
}
var userDir = $$.prop('user.dir');
var pgpKeyId = parsedArgs.val('k');
if (pgpKeyId == null) {
var encJSConf = $$.file($$.prop('user.home'), '.enc.js.conf');
if (!encJSConf.exists()) {
println('Config file ~/.enc.js.conf not found.');
return;
}
var pgpKeyId = RFile.from(encJSConf).string().trim();
if (pgpKeyId.length == 0) {
println('PGP key id is empty.');
return;
}
}
if (parsedArgs[0] == 'create') {
var fname;
if (parsedArgs.length > 1) {
fname = parsedArgs[1];
} else {
print('Please input filename: ');
fname = java.lang.System.console().readLine();
}
if (fname.length == 0) {
println('File name is not inputed.');
return;
}
var fn = fname.replace(/[^a-zA-Z0-9_.]/g, '_');
if ($$.file(userDir, fn).exists()) {
println('File exists: ' + fn);
return;
}
if ($$.file(userDir, fn + '.asc').exists()) {
println('File exists: ' + fn + '.asc');
return;
}
requireJS('component-swing.js');
var txt = showWindow('Create - ' + fn, '', 'Input message:', true).get();
if (txt == null) {
println('Message is not inputed.');
return;
}
RFile.from($$.file(userDir, fn)).write(txt);
$$.shell().commands('sh', '-c', 'gpg -r ' + pgpKeyId + ' -e -a --no-comment --comment "https://hatter.in/key" ' + fn).start();
if ($$.file(userDir, fn + '.asc').exists()) {
$$.file(userDir, fn).delete();
println('CREATE SUCCESS.');
}
return;
}
var userDirFile = $$.file(userDir);
var encFiles = $ARRAY(userDirFile.list()).filter((f) => { return (f.endsWith('.gpg') || f.endsWith('.asc')); });
if (encFiles.length == 0) {
println('Can NOT find any .gpg or .asc file.');
return;
}
var argFilterEncFiles = parsedArgs.length > 1? encFiles.filter((f) => { return f == parsedArgs[1]; }): [];
var selectFile = (argFilterEncFiles.length > 0)? argFilterEncFiles[0]: null;
if (selectFile == null && encFiles.length > 1) {
println('Please select one file:');
encFiles.forEach((f, i) => {
println(' ' + i + ': ' + f);
});
print('Input a number 0-' + (encFiles.length - 1) + ': ');
var ln = java.lang.System.console().readLine();
var idx = 0;
try {
idx = java.lang.Integer.parseInt(ln);
if ((idx < 0) || (idx >= encFiles.length)) {
println("Index range error: " + idx);
return;
}
selectFile = encFiles[idx];
} catch (e) {
println('Parse error: ' + (e.getMessage == null)? e: e.getMessage());
return;
}
}
if ((selectFile == null) && (encFiles.length == 1)) {
selectFile = encFiles[0];
}
if (selectFile == null) {
println('File is not selected.');
return;
}
var result = $$.shell().commands('sh', '-c', 'cat ' + selectFile + ' | gpg').start();
var out = result[0].string();
var err = result[1].string();
if (err.contains('public key decryption failed')) {
println('+ Decrypt file FAILED: ' + selectFile);
if (!Packages.me.hatter.tools.jssp.main.StandaloneMain.JSSP_MAIN_MUTE) {
println("ERROR detail:\n" + err);
}
return;
}
if (parsedArgs[0] == 'cat') {
println('Enc message: ' + selectFile);
println(repeat('-', 80));
println(out);
println(repeat('-', 80));
return;
}
var listOnlyKeyIdOut = $$.shell().commands('gpg', '--list-only', '--list-packets', selectFile).start()[1];
var keyIds = $STR(listOnlyKeyIdOut).split('\n')
.filter((x) => { return x.contains('ID '); })
.map((x) => { return x.replace(/.*ID\s+([0-9a-fA-F]+)[,\s]+.*/, '$1'); });
println('Encrypted key ids: [' + keyIds.join(', ') + ']');
requireJS('component-swing.js');
var actFLUC = parsedArgs[0].substring(0, 1).toUpperCase() + parsedArgs[0].substring(1);
var txt = showWindow(actFLUC + ' - ' + selectFile, out, actFLUC + ' encrypted message:', parsedArgs[0] == 'edit').get();
if (txt != null) {
// backup
$$.file(userDir, selectFile).renameTo($$.file(userDir, selectFile + '.back'));
// write text
var txtFile = selectFile.substring(0, selectFile.length - 4)
RFile.from($$.file(userDir, txtFile)).write(txt);
$$.shell().commands('sh', '-c', 'gpg ' + keyIds.map((x) => {return '-r ' + x; }).join(' ') + ' -e -a --no-comment --comment "https://hatter.in/key" ' + txtFile).start();
if ($$.file(userDir, txtFile + '.asc').exists()) {
$$.file(userDir, txtFile).delete();
println('UPDATE SUCCESS.');
}
} else {
println('BYE.');
}
};
main();
java.lang.System.exit(0);

View File

@@ -0,0 +1,29 @@
#!/usr/bin/env runjs
var main = function() {
if ($ARGS.length == 0) {
xprintln('[ERROR] No arguments.');
return;
}
var f = __.rfile.from($ARGS[0]);
if (f.notExists()) {
xprintln('[ERROR] File not exists: ' + $ARGS[0]);
return;
}
var o = $ARGS[0];
var n = $ARGS[0] + '.processed.mp4';
xprintln('[INFO] Start process: ' + o);
$$.shell(true).commands('ffmpeg', '-i', o, '-c:a', 'copy', '-c:v', 'copy', '-movflags', 'faststart', n).run();
$$.sleep(500);
if ($ARGS.length > 1 && $STR($ARGS[1]) == "re") {
if (__.rfile.from(n).exists()) {
__.rfile.from(o).file().delete();
$$.shell(true).commands("mv", n, o).run();
}
}
}
main();

30
scripts/ffmpegscale.js Normal file
View File

@@ -0,0 +1,30 @@
#!/usr/bin/env runjs
var main = function() {
if ($ARGS.length == 0) {
xprintln('[ERROR] No arguments.');
return;
}
var f = __.rfile.from($ARGS[0]);
if (f.notExists()) {
xprintln('[ERROR] File not exists: ' + $ARGS[0]);
return;
}
var scale = "480"; // 320
var o = $ARGS[0];
var n = $ARGS[0] + '.' + scale + 'ff.mp4';
xprintln('[INFO] Start process: ' + o);
$$.shell(true).commands('ffmpeg', '-i', o, '-c:a', 'copy', '-movflags', 'faststart', '-filter:v', 'scale='+scale+':-1', n).run();
$$.sleep(500);
if ($ARGS.length > 1 && $STR($ARGS[1]) == "re") {
if (__.rfile.from(n).exists()) {
__.rfile.from(o).file().delete();
$$.shell(true).commands("mv", n, o).run();
}
}
}
main();

14
scripts/finding.js Normal file
View File

@@ -0,0 +1,14 @@
#! /usr/bin/env runjs
requireJAR('findingall.jar');
var main = () => {
var args = $$.list();
args.add('-o');
args.add('UTF-8');
args.add('---NCL');
$ARR($ARGS).forEach((a) => { args.add(a); });
Packages.me.hatter.tools.finding.Finding.main(args.toArray($$.array(java.lang.String.class, 0)));
};
main();

View File

@@ -0,0 +1,19 @@
#! /usr/bin/env runjs
requireJAR('maven:me.hatter:crypto:1.9');
var KeyPairTool = Packages.me.hatter.tools.commons.security.key.KeyPairTool;
var PKType = Packages.me.hatter.tools.commons.security.key.PKType;
var PEMUtil = Packages.me.hatter.tools.commons.security.pem.PEMUtil;
var main = () => {
var kp = KeyPairTool.ins(PKType.secp256r1).generateKeyPair().getKeyPair();
var privatePem = PEMUtil.printPEM("PRIVATE KEY", kp.getPrivate().getEncoded());
var publicPem = PEMUtil.printPEM("PUBLIC KEY", kp.getPublic().getEncoded());
println("[OK] Private key PEM:\n" + privatePem);
println("[OK] Public key PEM:\n" + publicPem);
};
main();

View File

@@ -0,0 +1,40 @@
#! /usr/bin/env runjs
requireJAR('dataaccess-1.0.jar');
var System = java.lang.System;
var DataAccessUtil = Packages.me.hatter.tools.dataaccess.util.DataAccessUtil;
var SQLiteDialectImpl = Packages.me.hatter.tools.dataaccess.dialect.impl.SQLiteDialectImpl;
var InMemoryCompiler = Packages.me.hatter.tools.commons.classloader.compile.InMemoryCompiler;
var EntityJavaSourceCodeGenerateTool = Packages.me.hatter.tools.dataaccess.entity.EntityJavaSourceCodeGenerateTool;
var main = () => {
var accessJarPath = System.getProperty('user.home') + '/.jssp/cache/dataaccess-1.0.jar';
var classPath = System.getProperty('java.class.path') + ':' + accessJarPath;
var files = $$.file('.').listFiles();
var allCreateSQLs = [];
$ARRAY(files).filter((f) => { return f.isFile() && f.getName().endsWith('.entity.json') }).forEach((f) => {
println('Entity JSON file: ' + f);
var json = $$.rFile(f).string();
var sourceCode = EntityJavaSourceCodeGenerateTool.instance().config(json).generate();
$$.rFile(f.getName() + '.source.txt').write(sourceCode.getCharContent(true));
var clazz = InMemoryCompiler.systemInstance().classPath(classPath).compile(sourceCode);
var createSQL = DataAccessUtil.generateCreateSQL(clazz, new SQLiteDialectImpl());
println('... ' + clazz);
allCreateSQLs.push(createSQL + ';');
});
println();
if (allCreateSQLs.length == 0) {
println('No Create SQL Generated.');
} else {
println('All Create SQL:');
allCreateSQLs.forEach((sql) => {
println(' ' + sql);
});
}
};
main();

111
scripts/get.js Normal file
View File

@@ -0,0 +1,111 @@
#! /usr/bin/env runjs
var argsEx = require('component-args.js');
var bytes = require('component-bytes.js');
var counter = require('component-counter.js');
var gpg = require('component-gpg-ex.js');
var URLEncoder = java.net.URLEncoder;
var DEFAULT_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36';
var gpgEncryptedAuthToken = {/**LINES
-----BEGIN PGP MESSAGE-----
Comment: GPGTools - https://gpgtools.org
hQEMAwpgonLPA1NTAQf+MowR8XeAd6jtJhHE6s8FwmXyYEI1R8J3kEo+XBnUWXph
dVQYHUAj+lWl9Pd8YpJmImT+Qf9mseZSi0wbkUi6N1UJogwtx4sAu9szvLcEhYa2
68Oyl+AY8jdn608OKqXRwG8z4HVrzdFgyEBuyJ/GafDH+bXcLYNtROcb63FlMlhJ
zLymaJD85W3uKlmYqJ0/OHLxn+fruRvZz0ZxlN1w3lj8t0wqLk+cOcTVMZkpdiYD
BGj8fkS/OTQBBNACmsCJDoUdBEMSRpjU3z55Zn5EGK0R3uTkZfuo+pJjGaZEtz8m
kuM0Yxyvq38fzPC9zrGQKsyXBOH3B8/x7GqcNDEVRtJnAWDu4syv3FkiGAzyHiKZ
nEupU97rz+XL5fKU89i6+ttAAC+xIMkASAde/Z5CdOdGjwfjx3u7U+c8XmaAcQtE
ibIucc2d0dsCkynzket0EfqExEXj4NUqxmwIS118vKMZAwap3FnaxQ==
=fjt8
-----END PGP MESSAGE-----
*/};
var SITE_PROXY_MAP = {
"hatterink": "https://hatter.ink/pget.action?__auth_token={auth_token}&target={target}"
};
var main = () => {
var args = argsEx.parseDefARGs(['s', 'slient', 'S', 'skip-cert']);
var urllist = args.val('u', 'urllist');
var prefix = args.val('prefix');
var suffix = args.val('suffix');
if ((urllist == null) && (args.length < 1)) {
println('get.js [FLAGS] <URL> [<FILE NAME>]');
println(' -u, --urllist URL List');
println(' --prefix File prefix when using URL List');
println(' --suffix File suffix when using URL List');
println(' -s, --slient Slient mode');
println(' -S, --skip-cert Skip cert check');
println(' --agent <AGENT> User agent');
println(' -p, --proxy <SITE> Site, hatterink')
return;
}
if (urllist == null) {
downlaodURL(args, args[0], (args.length > 1)? args[1]: null);
} else {
var fl = __.rfile.from(urllist);
if (fl.notExists()) {
println('File list not exists: ' + urllist);
return;
}
var list = $ARRAY(fl.list()).filter((u) => {
return u.trim() != '';
});
list.forEach((u, i) => {
println('Processing ' + i + ' of ' + list.length + ':');
if ((prefix == null) && (suffix == null)) {
downlaodURL(args, u);
} else {
downlaodURL(args, u, (prefix || '') + $$.numFormat('0000').format(i) + (suffix || ''));
}
});
}
};
var downlaodURL = (args, url, fn) => {
var slient = args.flg('s', 'slient');
var skipCert = args.flg('S', 'skip-cert');
var agent = args.val('agent');
if (!/^http(s)?:\/\/.*/.test(url.toLowerCase())) {
println('URL should starts with http:// or https://');
return;
}
if (fn == null) {
var u = (url.contains('?')) ? url.substring(0, url.indexOf('?')) : url;
fn = URLEncoder.encode((u.contains('/')) ? u.substring(u.lastIndexOf('/') + 1) : u, 'UTF-8') || ('unknown-' + $$.date().millis());
}
var readlUrl = url;
var proxy = args.val('p', 'proxy');
if (proxy != null) {
var proxyUrl = SITE_PROXY_MAP[proxy];
if (proxyUrl == null) {
xprintln('[WARN] Unknown proxy: ' + proxy);
} else {
xprintln('[INFO] Using proxy: ' + proxy);
var authToken = gpg.decryptArmor(gpgEncryptedAuthToken);
readlUrl = proxyUrl.replace('{auth_token}', authToken).replace('{target}', encodeURIComponent(url));
}
}
if (!slient) { println('GET ' + url + ' -> ' + fn); }
var fos = new java.io.FileOutputStream(fn);
var len = $$.httpRequest()
.url(readlUrl)
.skipCertCheck(skipCert)
.addHeader('User-Agent', agent || DEFAULT_USER_AGENT)
.get(fos, (slient ? null : counter.getCounter2Bar()));
fos.close();
if (!slient) { println(); }
if (!slient) { println('File download finished, downloaded bytes: ' + bytes.showBytes(len)); }
};
main();

201
scripts/gitbook.js Normal file
View File

@@ -0,0 +1,201 @@
#! /usr/bin/env runjs
var ByteArrayOutputStream = java.io.ByteArrayOutputStream;
var Bytes = Packages.me.hatter.tools.commons.bytes.Bytes;
var FileUtil = Packages.me.hatter.tools.commons.file.FileUtil;
var argsjs = require('component-args.js');
var CALIBRE_HOME = '/Applications/calibre.app/Contents/MacOS';
var DOT = 'dot';
var NPM = 'npm';
var GITBOOK = 'gitbook';
var CALIBRE_EBOOK_CONVERT = 'ebook-convert';
var NODE_INSTALL_URL = 'https://nodejs.org/en/download/';
var CALIBRE_INSTALL_URL = 'https://calibre-ebook.com/download';
var DOT_INSTALL = 'brew install graphviz';
var GITBOOK_INSTALL = 'npm install -g gitbook-cli';
var DEFAULT_PROCESSOR_VIZ = null;
var DEFAULT_PROCESSOR = {
'plantuml': (lns, tmpDir) => {
$ONCE('gitbook.js-defaultprocessor-plantuml-requirejar-plantuml').run(() => {
requireJAR('plantuml-8059.jar');
});
var FileFormat = Packages.net.sourceforge.plantuml.FileFormat;
var FileFormatOption = Packages.net.sourceforge.plantuml.FileFormatOption;
var SourceStringReader = Packages.net.sourceforge.plantuml.SourceStringReader;
var puml = $ARR(lns).join('\n');
var dgst = Bytes.from(puml).digest($$.digests().sha256()).asHex();
var baos = new ByteArrayOutputStream();
var reader = new SourceStringReader(puml);
reader.generateImage(baos, new FileFormatOption(FileFormat.PNG, false));
$$.rFile(tmpDir, dgst + '.png').write(baos.toByteArray());
return '<img src="' + dgst + '.png' + '">';
},
'graphviz': (lns, tmpDir) => {
var viz = $ARR(lns).join('\n');
var vizB64 = Bytes.from(viz).asBase64();
var dgst = Bytes.from(viz).digest($$.digests().sha256()).asHex();
var vizToPngRes = $$.shell().commands('sh', '-c', 'echo ' + vizB64 + ' | base64 -D | dot -Tpng').start();
$$.rFile(tmpDir, dgst + '.png').write(vizToPngRes[0].bytes());
return '<img src="' + dgst + '.png' + '">';
}
};
// return null or string
var dealWithMarkdown = (f, tmpDir, mdList, plugins) => {
var list = [];
var codeTag = null;
var codeList = [];
var inCode = false;
$ARR(mdList).forEach((ln) => {
if (inCode) {
if ($STR(ln.trim()) == '```') {
// CODE ENDED
inCode = false;
var plugInFunc = null;
plugins.forEach((p) => {
if (plugInFunc == null) {
plugInFunc = p[codeTag || 'default'];
}
});
if (plugInFunc == null) {
// plugin not found
list.push('```' + codeTag);
codeList.forEach((ln) => { list.push(ln) } );
list.push('```');
} else {
list.push(plugInFunc(codeList, tmpDir));
}
} else {
codeList.push(ln);
}
} else if (ln.trim().startsWith('```')) {
// CODE STARTED
inCode = true;
codeList = [];
codeTag = ln.trim().substring(3).trim();
} else {
list.push(ln);
}
});
if (inCode) {
xprintln('[ERROR] Markdown content error: ' + f);
return null;
}
return list.join('\n');
};
// gitbook-cli OR https://github.com/GitbookIO/gitbook-pdf ?
var main = () => {
var args = argsjs.parseDefARGs(['default-processor', 'skip-delete-tmp']);
if (args.length < 1) {
xprintln('[ERROR] Need arguments.');
xprintln();
xprintln('gitbook.js [args] <output.ext>');
xprintln(' --default-processor enable default processor');
xprintln(' --skip-delete-tmp skip delete tmp dir');
xprintln(' -p, --processor <processor.js> with file processor');
xprintln(' -t, --type <"pdf"> default pdf');
xprintln(' -d, --dir <dir> default "."');
return;
}
var whichRes = $$.shell().commands('which', NPM).start();
if ($STR(whichRes[0].toString().trim()) == '') {
xprintln('[ERROR] Node is not installed.');
xprintln('[INFO] Install node URL: ' + NODE_INSTALL_URL);
return;
}
xprintln('[OK] Check node installed: ' + $$.shell().commands('node', '-v').start()[0].toString().trim());
var gitbookRes = $$.shell().commands('which', GITBOOK).start();
if ($STR(gitbookRes[0].toString().trim()) == '') {
xprintln('[ERROR] Gitbook is not installed.');
xprintln('[INFO] Install gitbook command: ' + GITBOOK_INSTALL);
return;
}
xprintln('[OK] Check gitbook installed: ' + $$.shell().commands('gitbook', '-V').start()[0].toString().trim().replace('\n', '; '));
var dotRes = $$.shell().commands('which', DOT).start();
if ($STR(dotRes[0].toString().trim()) == '') {
xprintln('[ERROR] Graphviz is not installed.');
xprintln('[INFO] Install graphviz command: ' + DOT_INSTALL);
return;
}
xprintln('[OK] Check graphviz installed: ' + $$.shell().commands('dot', '-V').mergeErrorOutput(true).start()[0].toString().trim().replace('\n', '; '));
var ebookConvert = $$.file(CALIBRE_HOME, CALIBRE_EBOOK_CONVERT);
if (!(ebookConvert.exists())) {
xprintln('[ERROR] Calibre is not installed.');
xprintln('[INFO] Install calibre URL: ' + CALIBRE_INSTALL_URL);
return;
}
xprintln('[OK] Check calibre installed: ' + $$.shell().commands(ebookConvert.getAbsolutePath(), '--version').start()[0].list().get(0));
var gitbookShell = $$.shell();
var ebookConvertRes = $$.shell().commands('which', CALIBRE_EBOOK_CONVERT).start();
if ($STR(ebookConvertRes[0].toString().trim()) == '') {
xprintln('[INFO] $PATH add calibre home: ' + CALIBRE_HOME);
gitbookShell.env('PATH', '$PATH:' + CALIBRE_HOME);
}
var _type = args.val('t', 'type') || 'pdf';
var _dir = args.val('d', 'dir') || '.';
if ($STR(_type) != 'pdf') {
xprintln('[ERROR] Currently only supports pdf.');
return;
}
var _tempDir = $$.file(_dir, '.tmp');
var plugins = [];
var processors = args.vals('p', 'processor');
processors.forEach((p) => {
xprintln('[INFO] Load processor: ' + p);
plugins.push(require('file://' + p));
});
if (args.flg('default-processor')) {
plugins.push(DEFAULT_PROCESSOR);
}
if (plugins.length > 0) {
if (_tempDir.exists()) {
xprintln('[INFO] Delete exists tmp dir: ' + _tempDir);
FileUtil.deleteDirectory(_tempDir);
}
xprintln('[INFO] Create tmp dir: ' + _tempDir);
_tempDir.mkdirs();
$ARR($$.file(_dir).listFiles()).forEach((f) => {
if (f.getName().toLowerCase().endsWith('.md')) {
var contents = $$.rFile(f).list();
var newContents = dealWithMarkdown(f, _tempDir, contents, plugins);
if (newContents != null) {
xprintln('[INFO] Update md file: ' + f.getName());
$$.rFile(_tempDir, f.getName()).write(newContents);
} else {
$$.rFile(_tempDir, f.getName()).write(contents.join('\n'));
}
}
});
}
var commands = [];
commands.push(GITBOOK);
commands.push(_type);
commands.push((plugins.length > 0) ? _tempDir : _dir);
commands.push(args[0]);
xprintln('[INFO] Run gitbook command: ' + $TO_JAVA_LIST(commands));
gitbookShell.commands(commands).run();
if (_tempDir.exists()) {
if (!(args.flg('skip-delete-tmp'))) {
xprintln('[INFO] Delete tmp dir: ' + _tempDir);
FileUtil.deleteDirectory(_tempDir);
}
}
};
main();

26
scripts/hash.js Normal file
View File

@@ -0,0 +1,26 @@
#! /usr/bin/env runjs
var main = () => {
var args = $ARRAY($ARGS);
if (args.length < 1) {
println('No args...');
println();
println('hash.js <FILE>')
return;
}
args.forEach((f) => {
var fi = $$.file(f);
if (fi.isDirectory()) { println('Skip directory: ' + fi); println(); return; }
println('Hashs for: ' + fi);
println('Length : ' + fi.length() + ' byte(s)');
['md5', 'sha1', 'sha256', 'sha384', 'sha512'].forEach((k) => {
var d = $$.digests()[k]();
var digest = $$.rFile(fi).digest(d);
println(repeat(' ', 6 - k.length) + k.toUpperCase() + ' : ' + digest.asHex());
println(repeat(' ', 6) + ' : ' + digest.asBase64());
});
println();
});
};
main();

9
scripts/hatterserver.js Normal file
View File

@@ -0,0 +1,9 @@
#! /usr/bin/env runjs
requireJAR('hatterserver-1.0.jar');
var main = () => {
Packages.hatterserver.Launcher.main($ARGS);
};
main();

50
scripts/javacc5.js Normal file
View File

@@ -0,0 +1,50 @@
#! /usr/bin/env runjs
var OSUtil = Packages.me.hatter.tools.commons.os.OSUtil;
//var argsjs = require('component-args.js');
var osjs = require('component-os.js');
var packagejs = require('component-package.js');
var javahomejs = require('component-javahome.js');
var filesystemjs = require('component-filesystem.js');
var JAVACC_PACKAGE_INFO = {
'5': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/javacc-5.0.zip',
//'package': 'https://playsecurity.org/getdoc/1749_C31883A04B509AF7E93BE382B37F7F88/javacc-5.0.zip',
'sha256': '9a692fdd4ee1365da540054f4bb95e4852cf0216ce1b7ba54470365f5e52c8c7',
'basePath': '~/.jssp/builder/javacc-5.0',
'subPath': 'javacc-5.0',
'bin': 'bin/javacc'
}
};
var main = () => {
var javaHome = javahomejs.getJavaHome('1.7');
if (javaHome == null) { javaHome = javahomejs.getJavaHome('1.8'); }
if (javaHome == null) { javaHome = javahomejs.getJavaHome('9.0'); }
if (javaHome == null) {
xprintln('[WARN] Cannot find java, use system Java.');
}
xprintln('[INFO] Get JavaCC local package info.');
var javaccLocalPackage = packagejs.getLocalPackage(JAVACC_PACKAGE_INFO['5'], true);
var commandArgs = [];
var buildCommands = [];
buildCommands.push(javaccLocalPackage.binFile);
$ARR($ARGS).forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
xprintln('[INFO] JAVA_HOME = ' + (javaHome || crender('[GREEN]@system')));
xprintln('[INFO] JAVACC_HOME = ' + javaccLocalPackage.packageHome);
xprintln('[INFO] ARGUMENTS = ' + $ARR(commandArgs).toJavaList());
var sh = $$.shell(true);
if (javaHome != null) {
sh.env('JAVA_HOME', javaHome).env('PATH', javaHome + '/bin:' + $$.env('PATH'));
}
sh.commands(buildCommands).run();
};
main();

50
scripts/javadoc.js Normal file
View File

@@ -0,0 +1,50 @@
#! /usr/bin/env runjs
var FastJSON = Packages.com.alibaba.fastjson.JSON;
var main = () => {
var javadocConfigFile = __.rfile.from('javadoc.json');
if (javadocConfigFile.notExists()) {
xprintln('[WARN] file `javadoc.json` not found!');
println();
println('Sample JSON:');
println(FastJSON.toJSONString($$.parseJSON(JSON.stringify({
"dest": "",
"source": "",
"subpackages": [
"com.example.a",
"com.example.b"
],
"encoding": "utf-8",
"charset": "utf-8"
})), true).replaceAll('\t', ' '));
return;
}
var javadocConfig = JSON.parse(javadocConfigFile.string());
var cmds = [];
cmds.push('javadoc');
if (javadocConfig.dest) {
cmds.push('-d');
cmds.push(javadocConfig.dest);
}
if (javadocConfig.source) {
cmds.push('-sourcepath');
cmds.push(javadocConfig.source);
}
if (javadocConfig.subpackages) {
cmds.push('-subpackages');
cmds.push(javadocConfig.subpackages.join(':'));
}
cmds.push('-encoding');
cmds.push(javadocConfig.encoding || 'utf-8');
cmds.push('-charset');
cmds.push(javadocConfig.charset || 'utf-8');
xprintln('[INFO] Command: ' + cmds.join(' '));
$$.shell(true).commands(cmds).run();
};
main();

71
scripts/konanc.js Normal file
View File

@@ -0,0 +1,71 @@
#! /usr/bin/env runjs
var OSUtil = Packages.me.hatter.tools.commons.os.OSUtil;
//var argsjs = require('component-args.js');
var osjs = require('component-os.js');
var packagejs = require('component-package.js');
var javahomejs = require('component-javahome.js');
var filesystemjs = require('component-filesystem.js');
var KONANC_PACKAGE_INFO = {
'macOS': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/kotlin-native-macos-0.5.tar.gz',
//'package': 'https://playsecurity.org/getdoc/1745_9CAC8D9CD48CE2362D7910AA09627555/kotlin-native-macos-0.5.tar.gz',
'sha256': '73dcaebb924b8597e71561e2b9027e64355fd08a0c3b28e055e550550f03cad2',
'basePath': '~/.jssp/builder/kotlin-native-macos-0.5',
'subPath': 'kotlin-native-macos-0.5',
'bin': 'bin/konanc'
},
'Linux': {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/kotlin-native-linux-0.5.tar.gz',
//'package': 'https://playsecurity.org/getdoc/1744_BA86D28143757D90507E80BD823392AB/kotlin-native-linux-0.5.tar.gz',
'sha256': '6c5630c3ba6104d263e3947f12bf975efaf54fd95d74db4bd2df1d211cead9e4',
'basePath': '~/.jssp/builder/kotlin-native-linux-0.5',
'subPath': 'kotlin-native-linux-0.5',
'bin': 'bin/konanc'
}
};
var main = () => {
if (osjs.getOS().arch != 'x86_64') {
xprintln('[ERROR] Only suports x86_64!');
return;
}
var javaHome = javahomejs.getJavaHome('1.8');
if (javaHome == null) { javaHome = javahomejs.getJavaHome('9.0'); }
if (javaHome == null) {
xprintln('[WARN] Cannot find java, use system Java.');
}
var packageInfo;
if (OSUtil.isMacOS()) {
packageInfo = KONANC_PACKAGE_INFO.macOS;
} else if (OSUtil.isLinux()) {
packageInfo = KONANC_PACKAGE_INFO.Linux;
} else {
xprintln('[ERROR] Only supports macOS and Linux.');
return;
}
xprintln('[INFO] Get konanc local package info.');
var konancLocalPackage = packagejs.getLocalPackage(packageInfo, true);
var commandArgs = [];
var buildCommands = [];
buildCommands.push(konancLocalPackage.binFile);
$ARR($ARGS).forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
xprintln('[INFO] JAVA_HOME = ' + (javaHome || crender('[GREEN]@system')));
xprintln('[INFO] KONANC_HOME = ' + konancLocalPackage.packageHome);
xprintln('[INFO] ARGUMENTS = ' + $ARR(commandArgs).toJavaList());
var sh = $$.shell(true);
if (javaHome != null) {
sh.env('JAVA_HOME', javaHome).env('PATH', javaHome + '/bin:' + $$.env('PATH'));
}
sh.commands(buildCommands).run();
};
main();

77
scripts/m3u8download.js Normal file
View File

@@ -0,0 +1,77 @@
#! /usr/bin/env runjs
var bytes = require('component-bytes.js');
var IOUtil = Packages.me.hatter.tools.commons.io.IOUtil;
var getM3u8AsList = (fn) => {
var m3u8FileContents;
if (/^https?:\/\/.*/i.test(fn)) {
println('Download m3u8 file: ' + fn);
m3u8FileContents = IOUtil.readToList($$.httpRequest().url(fn).get());
} else {
if (!$$.file(fn).exists()) {
println('M3U8 file not extists: ' + fn);
return;
}
m3u8FileContents = $$.rFile(fn).list();
}
return m3u8FileContents;
};
// http://youku.online-downloader.com/
var main = () => {
if ($ARGS.length < 1) {
println('No args!');
return;
}
var m3u8FileContents = getM3u8AsList($ARGS[0]);
var index = 0;
var tsList = [];
var totalMillis = 0;
var totalLength = 0;
var totalTsCount = 0;
m3u8FileContents.forEach((x) => { if ((/^https?:\/\/.*/.test(x))) { totalTsCount++; } });
m3u8FileContents.forEach((x) => {
if (!(/^https?:\/\/.*/.test(x))) {
// SKIP
return;
}
index++;
var tsFileFn = repeat('0', 5 - $STR(index).length) + index + '.ts';
tsList.push(tsFileFn);
println('File: ' + x + " --> " + tsFileFn + ' (' + index + '/' + totalTsCount + ')');
print('-- Downloading: ');
var tsFile = new java.io.File(tsFileFn);
if (tsFile.exists()) {
println('EXISTS!');
} else {
var _s = $$.date().millis();
var _len = 0;
var fos = new java.io.FileOutputStream(tsFile);
$$.httpRequest()
.url(x)
.addHeader('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36')
.get(fos, (x) => { print('.'); _len += x; });
fos.close();
var _e = $$.date().millis();
totalMillis += _e - _s;
totalLength += _len;
println(', filesize: ' + bytes.showBytes(_len) + ', speed: ' + bytes.showBytes((_len * 1000) / (_e - _s)) + '/s');
}
});
println('Join ts files...');
var cmdFile = $$.file('_temp_merge_ts');
var newFileName = new Date().getTime() + '.mp4'
$$.rFile(cmdFile).write('ffmpeg -i "concat:' + tsList.join('|') + '" -c copy -bsf:a aac_adtstoasc ' + newFileName);
$$.shell().inheritIO().commands('sh', '_temp_merge_ts').run();
cmdFile.delete();
println();
println('Finished, download video file is: ' + newFileName + ', filesize: ' + bytes.showBytes(totalLength) + ', speed: ' + bytes.showBytes((totalLength * 1000) / totalMillis) + '/s');
};
main();

79
scripts/macostool.js Normal file
View File

@@ -0,0 +1,79 @@
#! /usr/bin/env runjs
var args = require('component-args.js');
var printHelp = () => {
println('macostool.js cmd');
println('help Print help');
println('list-java Print java list')
println('list-network Print network devices');
println('listen-tcp Print TCP listen');
println('listen-udp Print UDP listen');
println('wifi-info Print WIFI info');
println('wifi-scan Print WIFI scan');
println('print-route Print route list');
println('install-brew Install brew');
println('install-jenv Install jenv')
println('install-ports Install MacPorts');
println('install-sdkman Install SDKMAN');
println('install-dart Install Dart');
};
var main = () => {
var parsedArgs = args.parseARGS();
if (parsedArgs.args.length == 0) {
printHelp();
return;
}
var commands = {
'listen-tcp': () => { // ==OR== netstat -Waltn | grep LISTEN
$$.shell().inheritIO().commands('lsof', '-iTCP', '-sTCP:LISTEN', '-n', '-P').run();
},
'listen-udp': () => {
$$.shell().inheritIO().commands('lsof', '-iUDP', '-P', '-n').run();
},
'wifi-info': () => {
$$.shell().inheritIO().commands('/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', '-I').run();
},
'wifi-scan': () => {
$$.shell().inheritIO().commands('/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', '-s').run();
},
'list-java': () => {
$$.shell().inheritIO().commands('/usr/libexec/java_home', '-V').run();
},
'list-network': () => {
$$.shell().inheritIO().commands('networksetup', '-listallhardwareports').run();
},
'print-route': () => {
$$.shell().inheritIO().commands('netstat', '-nr').run();
},
'install-brew': () => {
$$.shell().inheritIO().commands('/usr/bin/ruby', '-e', '"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"').run();
},
'install-jenv': () => {
$$.shell().inheritIO().commands('sh', '-c', 'curl -L -s get.jenv.io | bash').run();
},
'install-ports': () => {
println('Please access: https://www.macports.org/install.php');
},
'install-sdkman': () => {
$$.shell().inheritIO().commands('sh', '-c', 'curl -s "https://get.sdkman.io" | bash').run();
},
'install-dart': () => {
// https://www.dartlang.org/install/mac
println('$ brew tap dart-lang/dart');
println('$ brew install dart');
}
};
var nullCommand = (cmd) => {
println('[ERROR] Command not found: ' + cmd);
println();
printHelp();
};
(commands[parsedArgs.args[0]] || nullCommand)(parsedArgs.args[0]);
};
main();

43
scripts/makepassword.js Normal file
View File

@@ -0,0 +1,43 @@
#! /usr/bin/env runjs
var UnixArgsUtil = Packages.me.hatter.tools.commons.args.UnixArgsUtil;
var main = () => {
UnixArgsUtil.parseGlobalArgs($ARGS);
if (UnixArgsUtil.ARGS.flags().containsAny('h', 'help')) {
println('Make password from secure random, usage:');
println(' makepassword.js');
println(' h|help Help');
println(' l|len|length Password length in bytes (default 10)');
println(' c|cnt|count Password count (default 1)');
println(' e|ecn|encode Password encoding(base32, base58, base64, hex) (default base58)');
return;
}
var len = UnixArgsUtil.ARGS.kvalueAny('l', 'len', 'length') || 10;
var cnt = UnixArgsUtil.ARGS.kvalueAny('c', 'cnt', 'count') || 1;
var enc = $STR(UnixArgsUtil.ARGS.kvalueAny('e', 'enc', 'encode') || 'base58').toLowerCase();
var isNotSupportedEnc = false;
var random = $$.secureRandom();
(parseInt(cnt)).times(() => {
var passwdBs = random.nextBytes(len);
if (['32', 'b32', 'base32'].contains(enc)) {
println($$.io().bytes(passwdBs).asBase32());
} else if (['58', 'b58', 'base58'].contains(enc)) {
println($$.io().bytes(passwdBs).asBase58());
} else if (['64', 'b64', 'base64'].contains(enc)) {
println($$.io().bytes(passwdBs).asBase64());
} else if (['hex'].contains(enc)) {
println($$.io().bytes(passwdBs).asHex());
} else {
isNotSupportedEnc = true;
}
});
if (isNotSupportedEnc) {
println('Not supported encode: ' + enc);
}
};
main();

96
scripts/makeself.js Normal file
View File

@@ -0,0 +1,96 @@
#! /usr/bin/env runjs
var argsjs = require('component-args.js');
var packagejs = require('component-package.js');
var filesystemjs = require('component-filesystem.js');
var MAKESELF_PACKAGE_INFO = {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/makeself-2.4.0.tar.gz',
//'package': 'https://playsecurity.org/getdoc/2552_C2AE09CBA9C18B4B9E5472E0C2304C74/makeself-2.4.0.tar.gz',
'sha256': '76a8c3f3fad1b55c39ba2904a19e74962151f9481df03091d4e54938bdd13f50',
'basePath': '~/.jssp/builder/makeself-2.4.0',
'subPath': 'makeself-release-2.4.0',
'bin': 'makeself.sh'
};
var MAKESELF_PACKAGE_INFO_v230 = {
'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/makeself-2.3.0.tar.gz',
//'package': 'https://playsecurity.org/getdoc/1628_C2F12AFBC92C8A19A2E914B457AD053E/makeself-2.3.0.tar.gz',
'sha256': '87385ed878938c4cd6907d1401ec6ba5bee2224fb97f7865a11e617bf94d4a0b',
'basePath': '~/.jssp/builder/makeself-2.3.0',
'subPath': 'makeself-2.3.0',
'bin': 'makeself.sh'
};
var sampleMakeselfJSON = {
"files": [
"file1.txt",
"file2.txt"
],
"target": {
"options": [ "--sha256" ], // https://makeself.io/
"fileName": "sample.sh",
"label": "sample label",
"startupScript": "./startup.sh",
"startupScriptArgs": []
}
};
var main = () => {
var args = argsjs.parseDefARGs();
var makeself = $$.file(args.val('c', 'config') || 'makeself.json');
if (!(makeself.exists())) {
xprintln('[ERROR] Cannot find file `makeself.json`.');
xprintln('[INFO] Sample: ' + $$.stringify($$.parseJSON(JSON.stringify(sampleMakeselfJSON)), true));
return;
}
var makeselfJSON = JSON.parse($$.rFile(makeself).string());
xprintln('[INFO] Get makeself.sh local package info.');
var makeselfLocalPackage = packagejs.getLocalPackage(MAKESELF_PACKAGE_INFO, true);
xprintln('[INFO] Check local temp dir: .makeself_js_temp_dir');
var tempPath = $$.file('.makeself_js_temp_dir');
if (tempPath.exists()) { __.fileutil.deleteDirectory(tempPath); }
tempPath.mkdirs();
var abort = false;
makeselfJSON.files.forEach((fn) => {
if (abort) { return; }
var f = $$.file(fn);
if (!f.exists()) {
abort = true;
xprintln('[ERROR] File not exists: ' + fn);
return;
}
xprintln('[INFO] Copy file: ' + fn);
__.ioutil.copyFile(f, $$.file(tempPath, f.getName()));
if ((makeselfJSON.target.startupScript == $STR(f.getName())) || (makeselfJSON.target.startupScript == $STR('./' + f.getName()))) {
xprintln('[INFO] Set file executable: ' + fn);
filesystemjs.chmodAddExec($$.file(tempPath, f.getName()));
}
});
if (abort) { return; }
if (makeselfJSON.target == null) { makeselfJSON.target = {}; }
var makeselfCommands = [ makeselfLocalPackage.binFile.getAbsolutePath() ];
if (makeselfJSON.target.options) {
makeselfCommands = makeselfCommands.concat(makeselfJSON.target.options);
}
makeselfCommands = makeselfCommands.concat(['.makeself_js_temp_dir',
makeselfJSON.target.fileName || 'unnamed.sh',
makeselfJSON.target.label || '',
makeselfJSON.target.startupScript
]);
if (makeselfJSON.target.startupScriptArgs) {
makeselfJSON.target.startupScriptArgs.forEach((a) => { makeselfCommands.push(a); });
}
$$.shell().inheritIO().commands(makeselfCommands).run();
xprintln('[INFO] Clean up local temp dir: .makeself_js_temp_dir');
if (tempPath.exists()) { __.fileutil.deleteDirectory(tempPath); }
};
main();

78
scripts/mapdownload.js Normal file
View File

@@ -0,0 +1,78 @@
#! /usr/bin/env runjs
function long2tile(lon, zoom) {
return (Math.floor((lon + 180) / 360 * Math.pow(2, zoom)));
}
function lat2tile(lat, zoom) {
return (Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom)));
}
main = () => {
if ($ARGS.length < 3) {
println("Usage: mapdownload.js pattern true|false zoom [png|jpg]");
println(" | | | |");
println(" +-------+----------+----+----------- URL Pattern");
println(" | | |");
println(" +----------+----+----------- Reverse Y (Gaode -> TMS should set true)");
println(" | |");
println(" +----+----------- Zoom (0~20), 2_120,30~121,31");
println(" |");
println(" +----------- Image type");
return;
}
var pattern = $ARGS[0];
var reverseY = "true".equals($ARGS[1]);
var z = $ARGS[2];
var suffix = ($ARGS.length > 3) ? $ARGS[3] : 'png';
if (z.indexOf('_') < 0) {
var x_min = 0;
var y_min = 0;
var x_max = Math.pow(2, z) - 1;
var y_max = Math.pow(2, z) - 1;
} else {
var _z = z;
z = parseInt(_z.substring(0, _z.indexOf('_')));
var lngLats = _z.substring(_z.indexOf('_') + 1).split('~');
var lngLat1 = lngLats[0].split(',');
var lngLat2 = lngLats[1].split(',');
var x1 = long2tile(parseFloat(lngLat1[0]), z);
var x2 = long2tile(parseFloat(lngLat2[0]), z);
var y1 = lat2tile(parseFloat(lngLat1[1]), z);
var y2 = lat2tile(parseFloat(lngLat2[1]), z);
x_min = Math.min(x1, x2);
x_max = Math.max(x1, x2);
y_min = Math.min(y1, y2);
y_max = Math.max(y1, y2);
}
println('X, min: ' + x_min + ', max: ' + x_max);
println('Y, min: ' + y_min + ', max: ' + y_max);
var count = 0;
var total = (x_max - x_min + 1) * (y_max - y_min + 1);
for (var x = x_min; x <= x_max; x++) {
for (var y = y_min; y <= y_max; y++) {
count++;
var url = pattern;
url = url.replace(/\{x\}/g, "" + x);
url = url.replace(/\{y\}/g, "" + y);
url = url.replace(/\{z\}/g, "" + z);
var fiPath = $$.file("" + z, "" + x);
fiPath.mkdirs();
var fi = $$.file(fiPath, (reverseY ? (Math.pow(2, z) - 1 - y) : y) + "." + suffix);
if (!fi.exists()) {
println("Downloading: " + url + " ==> " + fi + " (" + count + "/" + total + ")");
var bs = $$.httpRequest().url(url).get().getBytes();
$$.rFile(fi).write(bs);
}
}
}
};
main();

108
scripts/markdownconvert.js Normal file
View File

@@ -0,0 +1,108 @@
#! /usr/bin/env runjs
requireJAR('markdown4j-2.2.jar');
var argsjs = require('component-args.js');
var counterjs = require('component-counter.js');
var File = java.io.File;
var FileUtil = Packages.me.hatter.tools.commons.file.FileUtil;
var Markdown4jProcessor = Packages.org.markdown4j.Markdown4jProcessor;
var BOOTSTRAP = 'https://playsecurity.org/css/bootstrap.css';
var BOOTSTRAP_THEME = 'https://playsecurity.org/css/bootstrap-theme.css';
var main = () => {
var args = argsjs.parseDefARGs();
if (args.length < 1) {
xprintln('[ERROR] Need arguments.');
xprintln();
xprintln('markdownconvert.js <file.md> [output.htm|output.pdf]');
xprintln();
xprintln(' -t, --title [PDF] Title');
//xprintln(' --author [PDF] Author')
return;
}
var mdFile = $$.file(args[0]);
if (!mdFile.exists()) {
xprintln('[ERROR] File not exists: ' + mdFile);
return;
}
xprintln('[INFO] Make tmp dir: .tmp')
var tmpDir = $$.file('.tmp');
tmpDir.mkdirs();
if (!$$.file(tmpDir, 'bootstrap.css').exists()) {
print('[INFO] Download file: bootstrap.css');
var fos = new java.io.FileOutputStream($$.file(tmpDir, 'bootstrap.css'));
$$.httpRequest().skipCertCheck().url(BOOTSTRAP).get(fos, counterjs.getCounter());
fos.close();
println();
}
if (!$$.file(tmpDir, 'bootstrap-theme.css').exists()) {
print('[INFO] Download file: bootstrap-theme.css');
var fos = new java.io.FileOutputStream($$.file(tmpDir, 'bootstrap-theme.css'));
$$.httpRequest().skipCertCheck().url(BOOTSTRAP_THEME).get(fos, counterjs.getCounter());
fos.close();
println();
}
var isPDF = false;
var targetFile = (args.length > 1) ? $$.file(args[1]) : $$.file(mdFile.getAbsoluteFile().getParentFile(), mdFile.getName() + '.pdf');
if (targetFile.getName().toLowerCase().endsWith('.pdf')) {
isPDF = true;
}
var htmlFile = (isPDF) ? $$.file('.tmp.htm') : targetFile;
xprintln('[INFO] Render markdown file to html file: ' + htmlFile.getName());
var md = $$.rFile(mdFile).string();
var html = new Markdown4jProcessor().process(md);
html = '<html>\n'
+ '<head>\n'
+ '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n'
+ '<link href=".tmp/bootstrap.css" rel="stylesheet">\n'
+ '<link href=".tmp/bootstrap-theme.css" rel="stylesheet">\n'
+ '</head>\n'
+ '<body>\n\n\n' + html + '\n\n\n</body>\n'
+ '</html>\n';
$$.rFile(htmlFile).write(html);
if (isPDF) {
xprintln('[INFO] Render html file to pdf file: ' + targetFile.getName());
var title = (args.val('t', 'title') || targetFile.getName()).replace('"', '\\"');
// https://manual.calibre-ebook.com/conversion.html
$$.shell().commands('sh', '-c',
'ebook-convert '
+ htmlFile.getAbsolutePath()
+ ' ' + targetFile.getAbsolutePath()
+ ' --title="' + title + '" --comments="" --language="en"'
//+ '--authors="' + (args.val('author') || $$.env('USER')) + '"'
+ ' --book-producer="markdownconvert.js" --publisher="markdownconvert.js"'
//+ ' --chapter="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter \')]"'
// DEFAULT: //*[((name()='h1' or name()='h2') and re:test(., 'chapter|book|section|part\s+', 'i')) or @class = 'chapter']
+ ' --chapter="//*[(name()=\'h2\') or @class = \'chapter\']"'
+ ' --chapter-mark="pagebreak" --page-breaks-before="/"'
+ ' --level1-toc="//*[(name()=\'h3\') or @class = \'section\']"'
//+ ' --level1-toc="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter-1 \')]"'
//+ ' --level2-toc="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter-2 \')]"'
//+ ' --level3-toc="descendant-or-self::*[contains(concat(\' \', normalize-space(@class), \' \'), \' book-chapter-3 \')]"'
//+ ' --no-chapters-in-toc'
//+ ' --pdf-add-toc'
+ ' --max-levels="1" --breadth-first'
+ ' --margin-left="62" --margin-right="62" --margin-top="56" --margin-bottom="56"'
+ ' --pdf-default-font-size="12" --pdf-mono-font-size="12"'
+ ' --paper-size="a4"'
+ ' --pdf-header-template="<p class=\'header\'><span style=\'color:gray;\'>_TITLE_</span></p>"'
+ ' --pdf-footer-template="<p class=\'footer\'><span>_SECTION_</span> <span style=\'float:right;\'>_PAGENUM_</span></p>"')
.run();
xprintln('[INFO] Clean up tmp files.');
htmlFile.delete();
FileUtil.deleteDirectory(tmpDir);
}
};
main();

17
scripts/markdowndocs.js Normal file
View File

@@ -0,0 +1,17 @@
#! /usr/bin/env runjs
var System = java.lang.System;
var LogUtil = Packages.me.hatter.tools.commons.log.LogUtil;
var LogType = Packages.me.hatter.tools.commons.log.LogUtil.LogType;
LogUtil.setLogTypeSet($$.asList(LogType.ERROR, LogType.WARN, LogType.INFO, LogType.DEBUG, LogType.TRACE), true);
requireJAR('maven:me.hatter:markdowndocsall:1.1');
var main = () => {
var Main = Packages.me.hatter.tools.markdowndocs.Main;
Main.main($ARGS);
};
main();

113
scripts/markdownpdf.js Normal file
View File

@@ -0,0 +1,113 @@
#! /usr/bin/env runjs
// http://wkhtmltopdf.org/downloads.html
// $ wkhtmltopdf --user-style-sheet scripts/for-pdf.css --header-left "Hatter's Test Document - v1.0"
// --header-right '[page]/[toPage]' --header-line --margin-top 2.3cm --header-spacing 8 --header-font-size 10
// --footer-line --footer-font-name 'Times New Roman' --footer-font-size 10 --footer-spacing 8 --margin-bottom 2.3cm
// --footer-center 'Copyright © 2017 Hatter Jiang. All Rights Reserved.' --debug-javascript test.htm test.pdf
requireJAR('markdown4j-2.2.jar');
var File = java.io.File;
var RFile = Packages.me.hatter.tools.commons.io.RFile;
var StringUtil = Packages.me.hatter.tools.commons.string.StringUtil;
var Markdown4jProcessor = Packages.org.markdown4j.Markdown4jProcessor;
var main = () => {
var whichResults = $$.shell().commands('which', 'wkhtmltopdf').start();
if (!whichResults[0].toString().contains('wkhtmltopdf')) {
println('[ERROR] `wkhtmltopdf` must be installed <http://wkhtmltopdf.org/downloads.html>')
return;
}
if ($ARGS == null || $ARGS.length == 0) {
println('markdownpdf.js - Render markdown to pdf.')
println();
println('ERROR: NO arguments assigned!');
println('markdownpdf.js filename.md [filename.pdf]');
return;
}
var mdFile = $$.file($ARGS[0]);
if (!mdFile.exists()) {
println('[ERROR] File not exists: ' + $ARGS[0]);
return;
}
var pdfFile = ($ARGS.length > 1)? $ARGS[1]: (StringUtil.substringBeforeLast(mdFile.getName(), '.') || mdFile.getName()) + '.pdf';
var defaultMarkdownpdfConfig = {
"header-left": "Sample Document - v1.0",
"header-right": "[page]/[toPage]",
"header-line": true,
"margin-top": "2.3cm",
"header-spacing": "8",
"header-font-size": "10",
"footer-line": true,
"footer-font-name": "Times New Roman",
"footer-font-size": "10",
"footer-spacing": "8",
"margin-bottom": "2.3cm",
"footer-center": "Copyright © 2017 Hatter Jiang. All Rights Reserved.",
"debug-javascript": true
//"user-style-sheet": "pdf.css"
};
var markdownpdfConfig = defaultMarkdownpdfConfig;
var fileMarkdownpdfConfig = $$.file('markdownpdf.json');
if (fileMarkdownpdfConfig.exists()) {
println('[INFO] Config file markdownpdf.json found, load config.');
markdownpdfConfig = JSON.parse(RFile.from(fileMarkdownpdfConfig).rReader().stringAndClose());
} else {
println('[INFO] Config file markdownpdf.json not found, load default config.');
}
var boolConfigKeys = $$.set();
boolConfigKeys.addAll($$.asList('header-line', 'footer-line', 'debug-javascript'));
var cmds = $$.list();
cmds.add('wkhtmltopdf');
["header-left", "header-right", "header-line", "margin-top", "header-spacing", "header-font-size", "footer-line",
"footer-font-name", "footer-font-size", "footer-spacing", "margin-bottom", "footer-center", "debug-javascript", "user-style-sheet"].forEach((k) => {
var conf = (markdownpdfConfig[k] == null)? defaultMarkdownpdfConfig[k]: markdownpdfConfig[k];
if (conf) {
cmds.add('--' + k);
if (!boolConfigKeys.contains(k)) {
cmds.add(conf);
}
}
});
println('[INFO] Render markdown file to temp html.')
var tempHtmlFile = File.createTempFile('markdowntopdf', '.html');
tempHtmlFile.deleteOnExit();
var md = RFile.from(mdFile).string();
var html = new Markdown4jProcessor().process(md);
html = '<html>\n'
+ '<head>\n'
+ '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n'
+ '<style>\n'
+ ' * {\n'
+ ' font-size: 60px;\n'
+ ' }\n'
+ '</style>\n'
+ '</head>\n'
+ '<body>\n\n\n' + html + '\n\n\n</body>\n'
+ '</html>\n';
RFile.from(tempHtmlFile).write(html);
cmds.add(tempHtmlFile.getAbsolutePath());
cmds.add(pdfFile);
println('[INFO] Execute command line: ' + cmds);
var result = $$.shell().commands(cmds.toArray(java.lang.reflect.Array.newInstance($$.clazz('java.lang.String'), 0))).start();
println('[INFO] Outputs: ')
if (result[1] && result[1].toString().trim().length > 0) {
println(result[1].toString().trim());
}
if (result[0].toString().trim().length > 0) {
println(result[0].toString().trim());
}
};
main();

17
scripts/markdownslide.js Normal file
View File

@@ -0,0 +1,17 @@
#! /usr/bin/env runjs
var System = java.lang.System;
var LogUtil = Packages.me.hatter.tools.commons.log.LogUtil;
var LogType = Packages.me.hatter.tools.commons.log.LogUtil.LogType;
LogUtil.setLogTypeSet($$.asList(LogType.ERROR, LogType.WARN, LogType.INFO, LogType.DEBUG, LogType.TRACE), true);
requireJAR('markdownslideall.jar');
var main = () => {
var Main = Packages.me.hatter.tools.markdownslide.Main;
Main.main($ARGS);
};
main();

150
scripts/mvnjar.js Normal file
View File

@@ -0,0 +1,150 @@
#! /usr/bin/env runjs
var argsEx = require('component-args.js');
var json = require('component-json-ex.js');
var gpg = require('component-gpg-ex.js');
var DefaultRollCounter = Packages.me.hatter.tools.commons.io.DefaultRollCounter;
// need pom?
var REPO_BASEURLS = {
'central': {
'jar': 'https://search.maven.org/remotecontent?filepath={gid}/{aid}/{ver}/{aid}-{ver}.jar',
'src': 'https://search.maven.org/remotecontent?filepath={gid}/{aid}/{ver}/{aid}-{ver}-sources.jar',
'pom': 'https://search.maven.org/remotecontent?filepath={gid}/{aid}/{ver}/{aid}-{ver}.pom'
},
'aliyun_central': {
'jar': 'https://maven.aliyun.com/repository/central/{gid}/{aid}/{ver}/{aid}-{ver}.jar',
'src': 'https://maven.aliyun.com/repository/central/{gid}/{aid}/{ver}/{aid}-{ver}-sources.jar',
'pom': 'https://maven.aliyun.com/repository/central/{gid}/{aid}/{ver}/{aid}-{ver}.pom'
}
};
var gpgEncryptedAuthToken = {/**LINES
-----BEGIN PGP MESSAGE-----
Comment: GPGTools - https://gpgtools.org
hQEMAwpgonLPA1NTAQf+MowR8XeAd6jtJhHE6s8FwmXyYEI1R8J3kEo+XBnUWXph
dVQYHUAj+lWl9Pd8YpJmImT+Qf9mseZSi0wbkUi6N1UJogwtx4sAu9szvLcEhYa2
68Oyl+AY8jdn608OKqXRwG8z4HVrzdFgyEBuyJ/GafDH+bXcLYNtROcb63FlMlhJ
zLymaJD85W3uKlmYqJ0/OHLxn+fruRvZz0ZxlN1w3lj8t0wqLk+cOcTVMZkpdiYD
BGj8fkS/OTQBBNACmsCJDoUdBEMSRpjU3z55Zn5EGK0R3uTkZfuo+pJjGaZEtz8m
kuM0Yxyvq38fzPC9zrGQKsyXBOH3B8/x7GqcNDEVRtJnAWDu4syv3FkiGAzyHiKZ
nEupU97rz+XL5fKU89i6+ttAAC+xIMkASAde/Z5CdOdGjwfjx3u7U+c8XmaAcQtE
ibIucc2d0dsCkynzket0EfqExEXj4NUqxmwIS118vKMZAwap3FnaxQ==
=fjt8
-----END PGP MESSAGE-----
*/};
var SITE_PROXY_MAP = {
"hatterink": "https://hatter.ink/pget.action?__auth_token={auth_token}&target={target}"
};
var __cachec_authToken = null;
var getRealUrl = (args, url) => {
var readlUrl = url;
var proxy = args.val('p', 'proxy');
if (proxy != null) {
var proxyUrl = SITE_PROXY_MAP[proxy];
if (proxyUrl == null) {
xprintln('[WARN] Unknown proxy: ' + proxy);
} else {
xprintln('[INFO] Using proxy: ' + proxy);
if (__cachec_authToken == null) {
__cachec_authToken = gpg.decryptArmor(gpgEncryptedAuthToken);
}
readlUrl = proxyUrl.replace('{auth_token}', __cachec_authToken).replace('{target}', encodeURIComponent(url));
}
}
return readlUrl;
};
var main = () => {
var args = argsEx.parseDefARGs(['use-wget']);
if (args == null || (args.length != 1 && args.length != 3)) {
println('Usage:');
println('mvnjar.js [--use-wget] [-r, --repo] [-p, --proxy] gid aid ver');
println('mvnjar.js [--use-wget] [-r, --repo] [-p, --proxy] gid:aid:ver');
println(' -r, --repo <REPO> x(central), central, aliyun_central')
println(' -p, --proxy <SITE> Site, hatterink')
return;
}
var repo = args.val('r', 'repo')
if (repo == null || repo == 'x') { repo = 'central'; }
var gid, aid, ver;
if (args.length == 1) {
var splitedArgs1 = $STR(args[0]).split(':');
if (splitedArgs1.length != 3) {
xprintln('[ERROR] Format error: ' + args[0]);
return;
}
gid = splitedArgs1[0];
aid = splitedArgs1[1];
ver = splitedArgs1[2];
} else {
gid = args[0];
aid = args[1];
ver = args[2];
}
var baseUrls = REPO_BASEURLS[repo];
if (baseUrls == null) {
xprintln('[ERROR] Repo not defined: ' + repo);
return;
}
var urlJar = baseUrls.jar;
var urlSrc = baseUrls.src;
var urlPom = baseUrls.pom;
var uj = urlJar.replace(/{gid}/g, gid.replace(/\./g, '/')).replace(/{aid}/g, aid).replace(/{ver}/g, ver);
println('JAR: ' + uj);
if (args.flg('use-wget')) {
$$.shell().commands('wget', uj, '-O', aid + '-' + ver + '.jar').run();
} else {
__.httprequest.fromUrl(getRealUrl(args, uj)).get(__.rfile.from(aid + '-' + ver + '.jar').file(), new DefaultRollCounter().prefix('Downloading ... '));
}
var hasSrc = true;
var us = urlSrc.replace(/{gid}/g, gid.replace(/\./g, '/')).replace(/{aid}/g, aid).replace(/{ver}/g, ver);
println('SRC: ' + us);
try {
if (args.flg('use-wget')) {
$$.shell().commands('wget', us, '-O', aid + '-' + ver + '-sources.jar').run();
} else {
__.httprequest.fromUrl(getRealUrl(args, us)).get(__.rfile.from(aid + '-' + ver + '-sources.jar').file(), new DefaultRollCounter().prefix('Downloading ... '));
}
} catch(e) {
hasSrc = false;
println('[WARN] download src failed.')
}
if (urlPom) {
var up = urlPom.replace(/{gid}/g, gid.replace(/\./g, '/')).replace(/{aid}/g, aid).replace(/{ver}/g, ver);
println('POM: ' + up);
if (args.flg('use-wget')) {
$$.shell().commands('wget', up, '-O', aid + '-' + ver + '-.pom').run();
} else {
__.httprequest.fromUrl(getRealUrl(args, up)).get(__.rfile.from(aid + '-' + ver + '.pom').file(), new DefaultRollCounter().prefix('Downloading ... '));
}
}
var b = {
repo: {
gid: gid,
aid: aid,
jar: aid + '-' + ver + '.jar',
pom: aid + '-' + ver + '.pom',
staticVersion: ver
}
};
if (hasSrc) {
b.repo.src = aid + '-' + ver + '-sources.jar';
}
var j = json.prettyJSON(b);
println(j);
__.rfile.from('build.json').write(j);
println('done')
};
main();

142
scripts/ossbackup.js Normal file
View File

@@ -0,0 +1,142 @@
#! /usr/bin/env runjs
requireJAR('aliyun-sdk-oss-2.4.1-SNAPSHOT.jar');
requireJAR('commons-beanutils-1.8.0.jar');
requireJAR('commons-codec-1.9.jar');
requireJAR('commons-collections-3.2.1.jar');
requireJAR('commons-lang-2.5.jar');
requireJAR('commons-logging-1.2.jar');
requireJAR('ezmorph-1.0.6.jar');
requireJAR('hamcrest-core-1.1.jar');
requireJAR('httpclient-4.4.1.jar');
requireJAR('httpcore-4.4.1.jar');
requireJAR('jdom-1.1.jar');
requireJAR('json-lib-2.4-jdk15.jar');
var File = java.io.File;
var System = java.lang.System;
var FileInputStream = java.io.FileInputStream;
var FileOutputStream = java.io.FileOutputStream;
var CounterInputStream = Packages.me.hatter.tools.commons.io.CounterInputStream;
var RFile = Packages.me.hatter.tools.commons.io.RFile;
var IOUtil = Packages.me.hatter.tools.commons.io.IOUtil;
var main = () => {
var start = $$.date().millis();
if ($ARGS.length == 0) {
println('Config file is not assigned.');
return;
}
var configJSON = null;
try {
var config = RFile.from($ARGS[0]).string();
configJSON = JSON.parse(config);
} catch(e) {
println('Parse config error: ' + e);
}
if (!configJSON || !configJSON.bucket || !configJSON.endpoint || !configJSON.accessKey || !configJSON.secretKey || !configJSON.backupFile) {
println('----- Config format -----');
println('{');
println(' \"endpoint\": \"<ENDPOINT>\",');
println(' \"accessKey\": \"<AK>\",');
println(' \"secretKey\": \"<SK>\",');
println(' \"bucket\": \"<BUCKET>\",');
println(' \"backupFile\": \"<BACKUPFILE>\",');
println(' \"path\": \"default-backup-path\",');
println(' \"limit\": \"10\",');
println('}');
return;
}
configJSON.path = configJSON.path || 'default-backup-path';
configJSON.limit = configJSON.limit || 10;
var OSSClient = Packages.com.aliyun.oss.OSSClient;
var ListObjectsRequest = Packages.com.aliyun.oss.model.ListObjectsRequest;
var client = new OSSClient(configJSON.endpoint, configJSON.accessKey, configJSON.secretKey);
try {
if (!client.doesBucketExist(configJSON.bucket)) {
println("Bucket NOT exists: " + configJSON.bucket);
return;
}
var getCounter = (() => {
var total = 0;
var step = 1024 * 64;
return (len) => {
var t = total;
total += len;
var n = parseInt(total / step) - parseInt(t / step);
if (n > 0) {
for (var i = 0; i < n; i++) {
print('.');
}
}
};
});
var backupFiles = (configJSON.backupFile instanceof Array)? configJSON.backupFile: [configJSON.backupFile];
backupFiles.forEach((backupFile) => {
println('+++++ Start backup file: ' + backupFile + ' +++++');
var yyyyMMddHHmmss = $$.date().fmt('yyyyMMddHHmmss').format($$.date().today());
var backupFileFile = new File(backupFile);
if (!backupFileFile.exists()) {
println("File not exists: " + backupFile);
return; // continue next file
}
var fileName = backupFileFile.getName();
var actualBackupFile = backupFile;
var actualBackupFileSuffix = "";
if (configJSON.gpg && configJSON.gpg.keyId) {
var newFilePath = new File(System.getProperty("java.io.tmpdir"), fileName + '-' + yyyyMMddHHmmss + ".gpg").getAbsolutePath();
actualBackupFile = newFilePath;
actualBackupFileSuffix = ".gpg";
println("Encrypt file with GPG: " + newFilePath);
$$.shell().commands('sh', '-c', 'gpg -r ' + configJSON.gpg.keyId + ' -e -o "' + newFilePath + '" ' + backupFile).start();
}
println('Upload file: ' + backupFile + '-' + yyyyMMddHHmmss + actualBackupFileSuffix);
var databaseDbGpg = new FileInputStream(actualBackupFile);
var counterIS = new CounterInputStream(databaseDbGpg, getCounter());
client.putObject(configJSON.bucket, configJSON.path + '/' + fileName + '-' + yyyyMMddHHmmss + actualBackupFileSuffix, counterIS);
println();
println('Clear OSS history files.');
var objectListing = client.listObjects(
new ListObjectsRequest(configJSON.bucket)
.withMaxKeys(100)
.withPrefix(configJSON.path + "/" + fileName + '-')
);
var sums = $ARRAY(objectListing.getObjectSummaries());
sums = sums.filter((s) => {
return (!(configJSON.path + "/").equals(s.getKey()));
}).filter((s) => {
return s.getKey().contains('/' + fileName + '-');
}).sort((a, b) => {
return b.getLastModified().compareTo(a.getLastModified());
});
for (var i = configJSON.limit; i < sums.length; i++) {
var s = sums[i];
println("Delete object: " + $$.asList(s.getKey(), s.getSize(), s.getLastModified()));
client.deleteObject(configJSON.bucket, s.getKey());
}
});
println('Backup finished, cost: ' + ($$.date().millis() - start) + ' ms.');
} catch(e) {
println('OSS Error: ' + e);
} finally {
client.shutdown();
}
};
main();

257
scripts/osssendfile.js Normal file
View File

@@ -0,0 +1,257 @@
#! /usr/bin/env runjs
requireJAR('aliyun-sdk-oss-2.4.1-SNAPSHOT.jar');
requireJAR('commons-beanutils-1.8.0.jar');
requireJAR('commons-codec-1.9.jar');
requireJAR('commons-collections-3.2.1.jar');
requireJAR('commons-lang-2.5.jar');
requireJAR('commons-logging-1.2.jar');
requireJAR('ezmorph-1.0.6.jar');
requireJAR('hamcrest-core-1.1.jar');
requireJAR('httpclient-4.4.1.jar');
requireJAR('httpcore-4.4.1.jar');
requireJAR('jdom-1.1.jar');
requireJAR('json-lib-2.4-jdk15.jar');
requireJAR('maven:external.jose4j:jose4j:0.5.5');
requireJAR('maven:org.slf4j:slf4j-api:1.7.21');
var oss = require('component-oss.js');
var args = require('component-args.js');
var bytes = require('component-bytes.js');
var counter = require('component-counter.js');
var gpg = require('component-gpg-ex.js');
var File = java.io.File;
var System = java.lang.System;
var FileInputStream = java.io.FileInputStream;
var FileOutputStream = java.io.FileOutputStream;
var JsonWebKey = Packages.org.jose4j.jwk.JsonWebKey;
var JsonWebEncryption = Packages.org.jose4j.jwe.JsonWebEncryption;
var KeyManagementAlgorithmIdentifiers = Packages.org.jose4j.jwe.KeyManagementAlgorithmIdentifiers;
var ContentEncryptionAlgorithmIdentifiers = Packages.org.jose4j.jwe.ContentEncryptionAlgorithmIdentifiers;
var CounterInputStream = Packages.me.hatter.tools.commons.io.CounterInputStream;
var RFile = Packages.me.hatter.tools.commons.io.RFile;
var IOUtil = Packages.me.hatter.tools.commons.io.IOUtil;
var KeyValue = Packages.me.hatter.tools.commons.network.HttpRequest.KeyValue;
var ListObjectsRequest = Packages.com.aliyun.oss.model.ListObjectsRequest;
var AESCryptTool = Packages.me.hatter.tools.commons.security.crypt.AESCryptTool;
var DefaultRollCounter = Packages.me.hatter.tools.commons.io.DefaultRollCounter;
var main = () => {
var start = $$.date().millis();
var parsedArgs = args.parseARGS(['noenc', 'removesourcefile']);
if ((parsedArgs.args.length != 1) && (parsedArgs.args.length != 3)) {
println('osssendfile.js -- upload file to playsecurity.org');
println();
println('osssendfile.js [--config config.json] list');
println('osssendfile.js [--config config.json] clear');
println('osssendfile.js [--config config.json] [--noenc] [--removesourcefile] [--jwk \'x\'] file.ext title keywords');
println('osssendfile.js [--config config.json] [--noenc] [--removesourcefile] [--jwk \'{JWK}\'] file.ext title keywords');
return;
}
var configJSON = null;
try {
var config = RFile.from(parsedArgs.values['config'] || '~/.jssp/config/osssendfile.json').string();
configJSON = JSON.parse(config);
} catch (e) {
println('Parse config error: ' + e);
}
var hasNoAccessKey = !configJSON.accessKey || !configJSON.secretKey;
var hasNoOidc = !configJSON.oidc;
if (!configJSON || !configJSON.bucket || !configJSON.endpoint || !configJSON.token || (hasNoAccessKey && hasNoOidc)) {
println('----- Config format -----');
println('{');
println(' \"endpoint\": \"<ENDPOINT>\",');
println(' \"accessKey\": \"<AK>\",');
println(' \"secretKey\": \"<SK>\",');
println(' \"bucket\": \"<BUCKET>\",');
println(' \"token\": \"<TOKEN>\",');
println(' \"deleteSourceFile\": false');
println('}');
println('----- OR -----');
println('{');
println(' \"endpoint\": \"<ENDPOINT>\",');
println(' \"bucket\": \"<BUCKET>\",');
println(' \"token\": \"<TOKEN>\",');
println(' \"oidc\": {');
println(' \"sub\": \"<SUB>\",');
println(' \"client_id\": \"<CLIENT_ID>\",');
println(' \"client_secret\": \"<CLIENT_SECRET>\"');
println(' },');
println(' \"deleteSourceFile\": false');
println('}');
return;
}
var stsCredential = null;
if (configJSON.oidc) {
var params = $$.list();
params.add(new KeyValue('client_id', configJSON.oidc.clientId));
params.add(new KeyValue('client_secret', configJSON.oidc.clientSecret));
params.add(new KeyValue('sub', configJSON.oidc.sub));
var createStsUrl = 'https://hatter.ink/oidc/create_sts.json';
var sts = $$.httpRequest().readTimeout(5 * 60 * 1000).url(createStsUrl).post(params);
var stsJSON = JSON.parse(sts.toString());
if (stsJSON.status != 200) {
println('Get STS failed: ' + stsJSON.message);
return;
}
stsCredential= stsJSON.data;
}
var OSSClient = Packages.com.aliyun.oss.OSSClient;
var client;
if (stsCredential) {
client = new OSSClient(configJSON.endpoint, stsCredential.accessKeyId, stsCredential.accessKeySecret, stsCredential.securityToken);
} else {
client = new OSSClient(configJSON.endpoint, configJSON.accessKey, configJSON.secretKey);
}
try {
if (parsedArgs.args.length == 1) {
var getSums = () => {
var objectListing = client.listObjects(
new ListObjectsRequest(configJSON.bucket)
.withMaxKeys(100)
.withPrefix('tempfiles/temp_transfer_')
);
return $ARRAY(objectListing.getObjectSummaries());
};
var commandMap = {
'list': () => {
var sums = getSums();
println('Find ' + sums.length + ' object(s).')
sums.forEach((s) => {
println("Object: " + $$.asList(s.getKey(), s.getSize(), s.getLastModified()));
});
println('DONE @' + new Date());
},
'clear': () => {
var sums = getSums();
println('Find ' + sums.length + ' object(s).')
sums.forEach((s) => {
println("Delete object: " + $$.asList(s.getKey(), s.getSize(), s.getLastModified()));
client.deleteObject(configJSON.bucket, s.getKey());
});
println('DONE @' + new Date());
},
'null': (cmd) => {
println('[ERROR] Unknown command: ' + cmd);
}
};
(commandMap[parsedArgs.args[0]] || commandMap['null'])(parsedArgs.args[0]);
return;
}
var file = parsedArgs.args[0];
var title = parsedArgs.args[1];
var keywords = parsedArgs.args[2];
var ext = (file.lastIndexOf('.') > 0) ? file.substring(file.lastIndexOf('.') + 1) : null;
var sendFile = $$.file(file);
if (!(sendFile.exists())) {
println("File not exists: " + sendFile);
return;
}
if (!client.doesBucketExist(configJSON.bucket)) {
println("Bucket NOT exists: " + configJSON.bucket);
return;
}
var isSecure = false;
var tempKey = $$.random().nextIoBytes(16);
var pJwk = parsedArgs.values['jwk'];
if (pJwk) {
var pJwkContent = pJwk[0];
if ((pJwk[0].length == 0) || ($STR(pJwk[0]) == 'x')) {
pJwkContent = gpg.decrypt('~/jwk.json.asc');
}
var jwk = JsonWebKey.Factory.newJwk(pJwkContent);
var senderJwe = new JsonWebEncryption();
senderJwe.setPlaintext(title);
senderJwe.setAlgorithmHeaderValue(KeyManagementAlgorithmIdentifiers.DIRECT);
senderJwe.setEncryptionMethodHeaderParameter(ContentEncryptionAlgorithmIdentifiers.AES_128_GCM);
senderJwe.setKey(jwk.getKey());
var encTitle = 'JWE:' + senderJwe.getCompactSerialization();
println('Encrypt JWE title: ' + title + ' --> ' + encTitle);
title = encTitle;
isSecure = true;
tempKey = __.bytes.from(jwk.getKey().getEncoded());
}
var isDoDefaultEnc = !parsedArgs.flags['noenc'];
var sendFileTemp = sendFile;
if (isDoDefaultEnc) {
sendFileTemp = $$.file(file + '.tmp');
println('Encryption local file: ' + sendFile + ' --> ' + sendFileTemp + (isSecure ? ' [secure]': ' [normal]'));
AESCryptTool.gcmEncrypt(tempKey.bytes()).counter(new DefaultRollCounter(sendFile.length()).prefix('Encrypting: ')).from(sendFile).to(sendFileTemp);
}
var newFile = 'tempfiles/temp_transfer_' + $$.date().millis() + (ext ? ('.' + ext) : '');
println('Uploading object: ' + sendFileTemp + ' --> ' + newFile + ', file size: ' + bytes.showBytes(sendFileTemp.length()));
var databaseDbGpg = new FileInputStream(sendFileTemp);
var counterIS = new CounterInputStream(databaseDbGpg, counter.getCounterBar(sendFileTemp.length()));
client.putObject(configJSON.bucket, newFile, counterIS);
println();
// var ossURL = oss.generateSignedURL(configJSON.endpoint, configJSON.accessKey, configJSON.secretKey, configJSON.bucket, newFile, 600 * 1000);
var ossURL = client.generatePresignedUrl(configJSON.bucket, newFile, new java.util.Date(new java.util.Date().getTime() + 600 * 1000)).toString();
println('Object URL: ' + ossURL);
println('Sending document ....');
var params = $$.list();
params.add(new KeyValue('jsonp', '1'));
params.add(new KeyValue('token', configJSON.token));
params.add(new KeyValue('url', ossURL));
params.add(new KeyValue('title', title));
params.add(new KeyValue('keywords', keywords));
if (isDoDefaultEnc) {
if (isSecure) {
params.add(new KeyValue('jwe_secure', "true"));
params.add(new KeyValue('real_length', sendFile.length()));
params.add(new KeyValue('real_sha256', __.rfile.from(sendFile).digest(__.digests.sha256()).asHex()));
} else {
params.add(new KeyValue('encryption', tempKey.asBase64()));
}
}
var res = $$.httpRequest().readTimeout(5 * 60 * 1000).url('https://playsecurity.org/doc/addDoc.jsonp').post(params);
println('Add doc result: ' + res);
var resJSON = JSON.parse(res.toString());
if (resJSON.status == 200) {
println("Deleteing object: " + newFile);
client.deleteObject(configJSON.bucket, newFile);
} else {
println("Object is not deleted: " + newFile);
}
if (isDoDefaultEnc) {
sendFileTemp.delete();
}
var deleteSourceFile = configJSON.deleteSourceFile || parsedArgs.flags['removesourcefile'] || false;
if (deleteSourceFile) {
println('Delete file: ' + sendFile);
sendFile.delete();
}
println('DONE @' + new Date());
} catch (e) {
println('OSS Error: ' + e);
} finally {
client.shutdown();
}
};
main();

60
scripts/ossuploader.js Normal file
View File

@@ -0,0 +1,60 @@
#! /usr/bin/env runjs
var oss = require('component-oss.js');
var args = require('component-args.js');
var counter = require('component-counter.js');
oss.requireJARs();
var main = () => {
var start = $$.date().millis();
var parsedArgs = args.parseARGS();
if ((parsedArgs.args.length < 1) || (!(parsedArgs.values['config']))) {
println('Config file or file is not assigned.');
println('ossuploader.js --config config.json filename.ext [target_filename.ext]');
return;
}
try {
var config = $$.rFile(parsedArgs.values['config']).string();
configJSON = JSON.parse(config);
} catch (e) {
println('Parse config error: ' + e);
}
if (!configJSON || !configJSON.bucket || !configJSON.endpoint || !configJSON.accessKey || !configJSON.secretKey) {
println('----- Config format -----');
println('{');
println(' \"endpoint\": \"<ENDPOINT>\",');
println(' \"bucket\": \"<BUCKET>\",');
println(' \"accessKey\": \"<AK>\",');
println(' \"secretKey\": \"<SK>\",');
println('}');
return;
}
println('OSS info: ' + configJSON.bucket + '@' + configJSON.endpoint);
oss.newClient(configJSON.endpoint, configJSON.accessKey, configJSON.secretKey).runWith((client) => {
if (!client.doesBucketExist(configJSON.bucket)) {
println("Bucket NOT exists: " + configJSON.bucket);
return;
}
var localFile = parsedArgs.args[0];
var remoteFile = parsedArgs.args[1] || parsedArgs.args[0].replace(/[^a-zA-Z0-9\.\-]/, '_');
println('Uploading file: ' + localFile + ' -> ' + remoteFile);
var counterIS = oss.createCounterIS(localFile);
client.putObject(configJSON.bucket, remoteFile, counterIS);
println();
counterIS.close();
println('Upload file finished, cost: ' + ($$.date().millis() - start) + ' ms.');
});
};
main();

19
scripts/pivlogin.js Normal file
View File

@@ -0,0 +1,19 @@
#! /usr/bin/env runjs
function generateLoginUrl() {
var exp = (new Date().getTime() + 1000*10) + '';
var digest_hex = __.digests.sha256().digest(__.bytes.from(exp).bytes()).asHex();
var result = $$.shell().commands('card-cli', 'piv-ecsign', '-s', 'r1', '-x', digest_hex, '--json').start();
var out = result[0].string();
var outJson = JSON.parse(out);
var signatureBase64 = outJson.signed_data_base64;
return 'https://hatter.ink/login/direct_sign_login.jssp?__auth_before=' + exp + '&__auth_keys=&__auth_sign=' + encodeURIComponent(signatureBase64);
}
function main() {
var url = generateLoginUrl();
println('Open URL: ' + url);
$$.shell().commands('open', url).start();
}
main();

31
scripts/proguard.js Normal file
View File

@@ -0,0 +1,31 @@
#! /usr/bin/env runjs
var osjs = require('component-os.js');
var packagejs = require('component-package.js');
var javahomejs = require('component-javahome.js');
var filesystemjs = require('component-filesystem.js');
var PROGUARD_PACKAGE_INFO = {
'package': 'https://playsecurity.org/getdoc/2442_C0AD8AB45B3FE6BFE30547EDDCE45B85/proguard6.0.3.zip',
'sha256': '0689f6e10e1308129cea9303981efc185009311cedcbf38fe0df0cd0128fc610',
'basePath': '~/.jssp/builder/proguard6.0.3',
'subPath': 'proguard6.0.3',
'bin': 'bin/proguard.sh'
};
var main = () => {
xprintln('[INFO] Get proguard local package info.');
var proguardLocalPackage = packagejs.getLocalPackage(PROGUARD_PACKAGE_INFO, true);
var commandArgs = [];
var buildCommands = [];
buildCommands.push(proguardLocalPackage.binFile);
$ARR($ARGS).forEach((a) => { buildCommands.push(a); commandArgs.push(a); });
xprintln('[INFO] PROGUARD_HOME = ' + proguardLocalPackage.packageHome);
xprintln('[INFO] ARGUMENTS = ' + $ARR(commandArgs).toJavaList());
$$.shell(true).commands(buildCommands).run();
};
main();

27
scripts/rename.js Normal file
View File

@@ -0,0 +1,27 @@
#! /usr/bin/env runjs
var main = function() {
var files = __.rfile.from('.').file().listFiles();
for (var i = 0; i < files.length; i++) {
var f = files[i];
if (!f.name.endsWith('.mp4')) {
continue;
}
var lastDotIndex = f.name.lastIndexOf('.');
if (lastDotIndex < 0) {
continue;
}
var filename = f.name.substring(0, lastDotIndex);
var isAllHex = /^[0-9A-Fa-f]+$/.test(filename);
var newFilename;
if (isAllHex) {
newFilename = __.bytes.fromHex(filename).toString() + '.mp4';
} else {
newFilename = __.bytes.from(filename).asHex() + '.mp4';
}
xprintln('[INFO] File: ' + filename, '->', newFilename);
f.renameTo(__.rfile.from('./' + newFilename).file());
}
};
main();

161
scripts/runjshelp.js Normal file
View File

@@ -0,0 +1,161 @@
#! /usr/bin/env runjs
var System = java.lang.System;
var JarFile = java.util.jar.JarFile;
var StringUtil = Packages.me.hatter.tools.commons.string.StringUtil;
var StandaloneMainInteractive = Packages.me.hatter.tools.jssp.main.StandaloneMainInteractive;
var ConsoleReadTool = Packages.me.hatter.tools.commons.console.ConsoleReadTool;
var ClassLoaderUtil = Packages.me.hatter.tools.commons.classloader.ClassLoaderUtil;
var ReflectUtil = Packages.me.hatter.tools.commons.reflect.ReflectUtil;
var searchClasses = (systemClassLoader) => {
var classes = [];
$ARRAY(systemClassLoader.getURLs()).forEach((u) => {
var jarFile = new JarFile(u.getFile());
var jarEntryEnum = jarFile.entries();
while (jarEntryEnum.hasMoreElements()) {
var jarFileEntry = jarEntryEnum.nextElement();
var jarFileEntryName = jarFileEntry.getName();
if (jarFileEntryName.endsWith('.class')) {
classes.push(jarFileEntryName);
}
}
});
return classes;
};
var convertFileNameToClasName = (c) => {
if (c.endsWith('.class')) {
c = c.substring(0, c.length - 6);
}
if (c.contains('/')) {
c = c.replace(/\//g, '.');
}
return c;
};
var getShortClassName = (c) => {
var lastDot = c.lastIndexOf('.');
return c.substring(lastDot + 1);
};
var isMatchCommandFilter = (c, fullCommandLines) => {
if (fullCommandLines.length > 1) {
for (var i = 1; i < fullCommandLines.length; i++) {
var filterCmd = fullCommandLines[i];
var isMatchShortClassName = filterCmd.startsWith('S');
filterCmd = filterCmd.substring(1);
var matchClassName = isMatchShortClassName? getShortClassName(convertFileNameToClasName(c)): c;
if (!matchClassName.toLowerCase().contains(filterCmd.toLowerCase())) {
return false;
}
}
}
return true;
};
var main = () => {
StandaloneMainInteractive.initJLine();
var systemClassLoader = ClassLoaderUtil.getSystemClassLoader();
ConsoleReadTool.from('usage> ').loop((ln) => {
var fullCommandLine = $STR(ln);
var fullCommandLines = fullCommandLine.split(/\s+/);
var cmd = fullCommandLines[0];
if ($$.asList('ls', 'll', 'list').contains(cmd)) {
$ARRAY(systemClassLoader.getURLs()).forEach((u) => {
println(u);
});
} else if ($$.asList('exit', 'quit').contains(cmd)) {
println('+ Bye!');
System.exit(0);
} else if ($$.asList('desc', 'describe').contains(cmd)) {
if (fullCommandLines.length == 1) {
println('Cmd format error.')
} else {
var c = convertFileNameToClasName(fullCommandLines[1]);
try {
var cls = $$.clazz(c);
var fields = $ARRAY(ReflectUtil.getDeclaredFields(cls));
if (fields && (fields.length > 0)) {
println('Field(s):');
fields.forEach((f) => {
println(' ' + f);
});
}
var methods = $ARRAY(ReflectUtil.getDeclaredMethods(cls));
if (methods && (methods.length > 0)) {
println('Method(s):');
methods.forEach((m) => {
println(' ' + m);
});
}
} catch (e) {
println('Error in desc : ' + c);
}
}
} else if ($$.asList('search').contains(cmd)) {
searchClasses(systemClassLoader).forEach((c) => {
if (!isMatchCommandFilter(c, fullCommandLines)) {
return;
}
println(c);
});
} else if ($$.asList('import').contains(cmd)) {
searchClasses(systemClassLoader).forEach((c) => {
if (!isMatchCommandFilter(c, fullCommandLines)) {
return;
}
var className = convertFileNameToClasName(c);
var showClassName = getShortClassName(className);
println('var ' + showClassName + ' = ' + (className.startsWith('java.')? '': 'Packages.') + className + ';');
});
} else if ($$.asList('require').contains(cmd)) {
if (fullCommandLines.length == 1) {
println('Cmd format error.');
} else {
for (var i = 1; i < fullCommandLines.length; i++) {
requireJAR(fullCommandLines[i]);
}
}
} else if ($$.asList('tree').contains(cmd)) {
var classMap = $$.treeMap();
searchClasses(systemClassLoader).forEach((c) => {
if (!isMatchCommandFilter(c, fullCommandLines)) {
return;
}
var className = c.substring(0, c.length - 6);
var classNames = className.split('\/');
var baseMap = classMap;
$ARRAY(classNames).forEach((p) => {
var m = baseMap.get(p);
if (m == null) {
m = $$.treeMap();
baseMap.put(p, m);
}
baseMap = m;
});
});
var depth = 0;
var printMap = (m) => {
$ARRAY(m.keySet()).forEach((p) => {
var m2 = m.get(p);
var hasSub = (m2 != null) && (!m2.isEmpty());
println(StringUtil.repeat(' ', depth) + p + (hasSub? '.': ''));
if (hasSub) {
depth += p.length + 1;
printMap(m2);
depth -= p.length + 1;
}
});
};
println(classMap.size());
printMap(classMap);
} else {
if (cmd != '') {
println('Unknow command: ' + cmd);
}
}
});
};
main();

116
scripts/scancert.js Normal file
View File

@@ -0,0 +1,116 @@
#! /usr/bin/env runjs
var TimeUnit = java.util.concurrent.TimeUnit;
var DirWalkTool = Packages.me.hatter.tools.commons.file.DirWalkTool;
var DirWalker = Packages.me.hatter.tools.commons.file.DirWalkTool.DirWalker;
var X509CertUtil = Packages.me.hatter.tools.commons.security.cert.X509CertUtil;
var OKGREEN = '\033[92m';
var WARNING = '\033[93m';
var FAIL = '\033[91m';
var UNDERLINE = '\033[4m';
var ENDC = '\033[0m';
var main = () => {
if ($ARGS == null || $ARGS.length == 0) {
println('scancert.js - Scan cert.')
println();
println('ERROR: NO arguments assigned!');
println('scancert.js <dir | file.pem>');
return;
}
var scanCount = 0;
var warnings = [];
var fails = [];
var minDayLeft = null;
var maxDayLeft = null;
var scanFile = (is, file) => {
var bytes = $$.io().bytesAndClose(is);
if (bytes.toString().contains('BEGIN CERTIFICATE')) {
scanCount++;
println('[INFO] Cert pem file found: ' + file);
// is cert pem file
var certs = X509CertUtil.orderX509CertificateList(X509CertUtil.parseX509CertificateList(bytes.getBytes()));
if (certs.size() < 1) {
println('[ERROR] Cannot find any cert.');
} else {
var todayMillis = $$.date().millis();
var leafCert = certs.get(0);
var notAfter = leafCert.getNotAfter();
var altNames = leafCert.getSubjectAlternativeNames();
var colorStart = OKGREEN;
var colorEnd = ENDC;
if (notAfter.getTime() < (todayMillis + TimeUnit.DAYS.toMillis(10))) {
colorStart = FAIL;
fails.push(file);
} else if (notAfter.getTime() < (todayMillis + TimeUnit.DAYS.toMillis(30))) {
colorStart = WARNING;
warnings.push(file);
}
var dayLeft = parseInt((notAfter.getTime() - todayMillis) / TimeUnit.DAYS.toMillis(1));
minDayLeft = (minDayLeft == null)? dayLeft: Math.min(minDayLeft, dayLeft);
maxDayLeft = (maxDayLeft == null)? dayLeft: Math.max(maxDayLeft, dayLeft);
println(colorStart
+ 'Expires: '+ $$.date().fmt('yyyy-MM-dd').format(notAfter)
+ ' (' + dayLeft + ' days)'
+ colorEnd
+ ', DNS Name(s): ' + $ARRAY(altNames).map((n) => { return n.get(1) }).join(', '));
}
}
};
var f = $$.file($ARGS[0]);
if (!f.exists()) {
println('File or Directory not exists: ' + f);
return;
}
if (f.isFile()) {
scanFile($$.rFile(f).rStream().stream(), f);
} else {
var dir = f;
println('[INFO] Scan .pem file(s): ' + dir);
var walkTool = new DirWalkTool(dir);
walkTool.walk(new DirWalker({
"accept": (file) => {
if (file.isDirectory()) {
return true;
}
if (file.getName().endsWith('.pem')) {
return true;
}
},
"readInputStream": (is, file) => {
scanFile(is, file);
}
}));
}
println();
println('Scaned file: ' + scanCount);
if (warnings.length > 0) {
print(WARNING);
println('WARNINGS:');
warnings.forEach((f) => {
println(f);
});
print(ENDC);
}
if (fails.length > 0) {
print(FAIL);
println('FAILS:');
fails.forEach((f) => {
println(f);
});
print(ENDC);
}
if ((warnings.length == 0) && (fails.length == 0)) {
println(OKGREEN + 'No waning or fail found.' + ENDC)
}
if ((minDayLeft != null) && (maxDayLeft != null)) {
println('Day left, min: ' + minDayLeft + ', max: ' + maxDayLeft);
}
};
main();

View File

@@ -0,0 +1,59 @@
#! /usr/bin/env runjs
var jose = require('component-jose.js');
var args = require('component-args.js');
var main = () => {
var parsedArgs = args.parseARGS();
var secureosssendfileConfRFile = __.rfile.from('~/.jssp/config/secureosssendfile.jwk');
if (secureosssendfileConfRFile.notExists()) {
xprintln('[ERROR] secureosssendfile.jwk NOT found.');
return;
}
var jwk = jose.jwk.load(secureosssendfileConfRFile.string());
var osssendfilejsRFile = __.rfile.from('~/bin/osssendfile.js');
if (osssendfilejsRFile.notExists()) {
xprintln('[ERROR] osssendfile.js NOT found.')
return;
}
if ((parsedArgs.args.length != 2) && (parsedArgs.args.length != 3)) {
println('secureosssendfile.js -- secure upload file to playsecurity.org');
println();
println('secureosssendfile.js file.ext [newFn] keywords');
return;
}
var fn = parsedArgs.args[0];
var newFn = fn;
var kw;
if (parsedArgs.args.length == 2) {
kw = parsedArgs.args[1];
} else {
newFn = parsedArgs.args[1];
kw = parsedArgs.args[2];
}
if ($STR(newFn) == '_IN') {
print('Input new fn: ');
newFn = java.lang.System.console().readLine();
println('[INFO] Input file name: ' + newFn);
}
var encFn = $$.date().millis() + '.gpg';
xprintln('[INFO] GPG encrypt file: ' + fn + " -> " + encFn)
$$.shell(true).commands('gpg', '-e', '-r', 'D0386B7F', '-o', encFn, fn).run();
var jweNewFn = 'JWE:' + jose.jwe.enc(jwk, newFn);
xprintln('[INFO] Send file: ' + encFn + ' -> ' + jweNewFn);
$$.shell(true).commands('osssendfile.js', encFn, jweNewFn, kw).run();
$$.file(encFn).delete();
xprintln('[INFO] Done!')
};
main();

114
scripts/server.js Normal file
View File

@@ -0,0 +1,114 @@
#! /usr/bin/env runjs
requireJS('component-httpserver.js');
var FileInputStream = java.io.FileInputStream;
var IOUtil = Packages.me.hatter.tools.commons.io.IOUtil;
var getContentTypeByExt = (ext) => {
if (ext == null) { return 'application/octet-stream' }
var lowerExt = ext.toLowerCase();
if ($$.asList('jpg', 'jpe', 'jpeg').contains(lowerExt)) {
return 'image/jpeg';
} else if ($$.asList('png').contains(lowerExt)) {
return 'image/png';
} else if ($$.asList('txt', 'text', 'pem').contains(lowerExt)) {
return 'text/plain';
} else if ($$.asList('htm', 'html').contains(lowerExt)) {
return 'text/html';
} else if ($$.asList('js').contains(lowerExt)) {
return 'text/javascript';
} else if ($$.asList('json').contains(lowerExt)) {
return 'application/json';
} else if ($$.asList('doc').contains(lowerExt)) {
return 'application/msword';
} else if ($$.asList('xls').contains(lowerExt)) {
return 'application/vnd.ms-excel';
} else if ($$.asList('ppt').contains(lowerExt)) {
return 'application/vnd.ms-powerpoint';
} else if ($$.asList('pdf').contains(lowerExt)) {
return 'application/pdf';
} else if ($$.asList('crt').contains(lowerExt)) {
return 'application/x-x509-ca-cert';
} else if ($$.asList('mp3').contains(lowerExt)) {
return 'audio/mp3';
} else if ($$.asList('mp4').contains(lowerExt)) {
return 'video/mpeg4';
} else if ($$.asList('xml').contains(lowerExt)) {
return 'text/xml';
}
// Unknow ext.
return 'application/octet-stream';
};
var main = () => {
if (($ARGS == null) || ($ARGS.length < 2)) {
println('server.js - Run server.');
println();
println('ERROR: NO arguments assigned!')
println('CMD: server.js <port> <path>')
println(' port server port')
println(' path server path')
return;
}
var port = parseInt($ARGS[0]);
var path = $STR($ARGS[1]);
if (isNaN(port) || (port <= 0) || (port > 65535)) {
println('ERROR: port error: ' + port)
return;
}
var filePath = $$.file(path);
if (!filePath.exists() || !filePath.isDirectory()) {
println('ERROR: path not exists or not a directory: ' + path)
return;
}
serveHTTP(port, (httpExchange) => {
var requestURI = httpExchange.getRequestURI().toString();
println('Request received: ' + requestURI);
try {
var requestPath = requestURI.startsWith('/')? requestURI.substring(1): requestURI;
var f = $$.file(filePath, requestPath);
if (!f.exists()) {
return { "status": 404, "text": "404\n\nResource not found: " + requestURI + '\n' };
}
if (f.isDirectory()) {
if (!requestURI.endsWith('/')) {
return { "status": 302, "headers": [["Location", requestURI + '/' ]], "bytes": $$.byteArray(0) };
}
var result = [];
$ARRAY(f.list()).forEach((fn) => {
result.push(fn);
});
return {"text": "Directory listing:\n\n" + result.join('\n') + '\n' };
}
var fileExtIndex = f.getName().lastIndexOf('.');
var fileExt = (fileExtIndex > 0)? f.getName().substring(fileExtIndex + 1): null;
var fileLength = f.length();
httpExchange.sendResponseHeaders(200, 0);
var responseHeaders = httpExchange.getResponseHeaders();
responseHeaders.set('Content-Type', getContentTypeByExt(fileExt));
responseHeaders.set('Content-Length', fileLength);
var response = httpExchange.getResponseBody();
var fis = new FileInputStream(f);
IOUtil.copy(fis, response)
IOUtil.closeQuietly(fis);
IOUtil.closeQuietly(response);
} catch(e) {
if (e && e.printStackTrace) {
e.printStackTrace();
} else {
println('[ERROR] Exception: ' + e);
}
return { "status": "500", "text": "[ERROR] Exception: " + e + '\n' };
}
});
};
main();

35
scripts/server2.js Normal file
View File

@@ -0,0 +1,35 @@
#! /usr/bin/env runjs
var httpserver = require('component-httpserver-ex.js');
var main = () => {
if (($ARGS == null) || ($ARGS.length < 2)) {
println('server2.js - Run server2.');
println();
println('ERROR: NO arguments assigned!');
println('CMD: server2.js <port> <path>');
println(' port server port');
println(' path server path');
return;
}
var port = parseInt($ARGS[0]);
var path = $STR($ARGS[1]);
if (isNaN(port) || (port <= 0) || (port > 65535)) {
println('ERROR: port error: ' + port);
return;
}
var filePath = $$.file(path);
if (!filePath.exists() || !filePath.isDirectory()) {
println('ERROR: path not exists or not a directory: ' + path);
return;
}
httpserver.serveHTTP(port, (httpExchange) => {
return httpserver.handleFile(httpExchange, { handleDir: true, basePath: path }) || {
status: 404,
text: 'File not found!'
};
});
};
main();

11
scripts/showmyip.js Normal file
View File

@@ -0,0 +1,11 @@
#! /usr/bin/env runjs
var main = () => {
var myIP = $$.httpRequest()
.url('http://ifconfig.io/')
.addHeader('User-Agent', 'curl/0.0.0')
.get().toString().trim();
println('IP address is: ' + myIP);
};
main();

140
scripts/signpdf.js Normal file
View File

@@ -0,0 +1,140 @@
#! /usr/bin/env runjs
requireJAR('bcpkix-jdk15on-154.jar');
requireJAR('bcprov-jdk15on-154.jar');
requireJAR('bcprov-ext-jdk15on-154.jar');
requireJAR('itextpdf-5.5.11.jar');
var JavaArray = java.lang.reflect.Array;
var Security = java.security.Security;
var StringReader = java.io.StringReader;
var BufferedReader = java.io.BufferedReader;
var FileOutputStream = java.io.FileOutputStream;
var X509Certificate = java.security.cert.X509Certificate;
var Rectangle = Packages.com.itextpdf.text.Rectangle;
var PdfName = Packages.com.itextpdf.text.pdf.PdfName;
var PdfReader = Packages.com.itextpdf.text.pdf.PdfReader;
var PdfStamper = Packages.com.itextpdf.text.pdf.PdfStamper;
var PdfPKCS7 = Packages.com.itextpdf.text.pdf.security.PdfPKCS7;
var MakeSignature = Packages.com.itextpdf.text.pdf.security.MakeSignature;
var DigestAlgorithms = Packages.com.itextpdf.text.pdf.security.DigestAlgorithms;
var BouncyCastleDigest = Packages.com.itextpdf.text.pdf.security.BouncyCastleDigest;
var PrivateKeySignature = Packages.com.itextpdf.text.pdf.security.PrivateKeySignature;
var CryptoStandard = Packages.com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard;
var ExternalSignatureContainer = Packages.com.itextpdf.text.pdf.security.ExternalSignatureContainer;
var ExternalBlankSignatureContainer = Packages.com.itextpdf.text.pdf.security.ExternalBlankSignatureContainer;
var BouncyCastleProvider = Packages.org.bouncycastle.jce.provider.BouncyCastleProvider;
var PrivateKeyParseTool = Packages.me.hatter.tools.commons.security.rsa.PrivateKeyParseTool;
var X509CertUtil = Packages.me.hatter.tools.commons.security.cert.X509CertUtil;
var emptySignature = (src, dest, fieldname, chain, reason, location) => {
var reader = new PdfReader(src);
var os = new FileOutputStream(dest);
var stamper = PdfStamper.createSignature(reader, os, '\0');
var appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(new Rectangle(20, 748, 180, 780), 1, fieldname);
appearance.setCertificate(chain[0]);
if (reason) {
appearance.setReason(reason);
}
if (location) {
appearance.setLocation(location);
}
var external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.signExternalContainer(appearance, external, 8192);
};
var createSignature = (src, dest, fieldname, pk, chain) => {
var reader = new PdfReader(src);
var os = new FileOutputStream(dest);
var external = new ExternalSignatureContainer({
'sign': (is) => {
var signature = new PrivateKeySignature(pk, "SHA256", "BC");
var hashAlgorithm = signature.getHashAlgorithm();
var digest = new BouncyCastleDigest();
var sgn = new PdfPKCS7(null, chain, hashAlgorithm, null, digest, false);
var hash = DigestAlgorithms.digest(is, digest.getMessageDigest(hashAlgorithm));
var sh = sgn.getAuthenticatedAttributeBytes(hash, null, null, CryptoStandard.CMS);
var extSignature = signature.sign(sh);
sgn.setExternalDigest(extSignature, null, signature.getEncryptionAlgorithm());
return sgn.getEncodedPKCS7(hash, null, null, null, CryptoStandard.CMS);
},
'modifySigningDictionary': (signDic) => {
// DO NOTHING
}
});
MakeSignature.signDeferred(reader, fieldname, os, external);
};
var printConfigFileFormat = () => {
println('Format:');
println('{');
println(' "certs": "<PATH>/certs.pem",');
println(' "privKey": "<PATH>/privKey.pem.gpg"');
println('}');
};
var main = () => {
if ($ARGS == null || $ARGS.length == 0) {
println('signpdf.js - Sign PDF.')
println();
println('ERROR: NO arguments assigned!');
println('signpdf.js <file.pdf> [reason [location]]');
return;
}
var reason = ($ARGS.length > 1)? $ARGS[1]: null;
var location = ($ARGS.length > 2)? $ARGS[2]: null;
var pdf = $$.file($ARGS[0]);
if (!pdf.exists()) {
println('File not exists: ' + pdf);
return;
}
if (!pdf.getName().toLowerCase().endsWith('.pdf')) {
println('File is not PDF: ' + pdf);
return;
}
var configFile = $$.file($$.prop('user.home'), '.signpdf.js.json');
if (!configFile.exists()) {
println('SignPDF.js config file not found: ' + configFile);
printConfigFileFormat();
return;
}
var configObject = JSON.parse($$.rFile(configFile).rReader().stringAndClose());
if (!configObject.privKey || !configObject.certs) {
println('Config file error: ' + configFile);
printConfigFileFormat();
return;
}
if ($$.file($ARGS[0].replace('.pdf', '-signed.pdf')).exists()) {
println('Target file exists: ' + $ARGS[0].replace('.pdf', '-signed.pdf'));
return;
}
Security.addProvider(new BouncyCastleProvider());
var result = $$.shell().commands('sh', '-c', 'cat ' + configObject.privKey + ' | gpg').start();
var out = result[0].rStream().rReader().stringAndClose();
var err = result[1].rStream().rReader().stringAndClose();
if (err.contains('public key decryption failed')) {
println('+ Decrypt file FAILED: ' + configObject.privKey);
if (!Packages.me.hatter.tools.jssp.main.StandaloneMain.JSSP_MAIN_MUTE) {
println("ERROR detail:\n" + err);
}
return;
}
var privateKeyParseTool = new PrivateKeyParseTool(new BufferedReader(new StringReader(out)));
var certList = X509CertUtil.parseX509CertificateList($$.rFile(configObject.certs).rStream().bytesAndClose());
var chain = certList.toArray(JavaArray.newInstance(certList.get(0).getClass(), certList.size()));
var pk = privateKeyParseTool.read();
var temp = '~' + $$.date().millis() + '.pdf';
try {
emptySignature(pdf, temp, "sig", chain, reason, location);
createSignature(temp, $ARGS[0].replace('.pdf', '-signed.pdf'), "sig", pk, chain);
} finally {
$$.file(temp).delete();
}
};
main();

95
scripts/split.js Normal file
View File

@@ -0,0 +1,95 @@
#! /usr/bin/env runjs
var argsjs = require('component-args.js');
var parseSize = (s) => {
if (s == null) { return $$.num(0); }
s = s.toLowerCase();
if (!(/^\d+[kmg]?$/i.test(s))) {
throw 'Size format error: ' + s;
}
if (s.endsWith('k')) {
return $$.num(s.substring(0, s.length - 1)).mul(1024);
}
if (s.endsWith('m')) {
return $$.num(s.substring(0, s.length - 1)).mul(1024).mul(1024);
}
if (s.endsWith('g')) {
return $$.num(s.substring(0, s.length - 1)).mul(1024).mul(1024).mul(1024);
}
return $$.num(s);
};
var main = () => {
var args = argsjs.parseDefARGs(['h', 'help']);
if ((args.flg('h', 'help')) || (args.length == 0)) {
println('split.js <file.ext>');
println(' -h, --help Print help');
println(' -s, --size File size(default 20m)');
println(' -p, --prefix File prefix(default filename + ".")');
println(' --suffix File suffix(default "")');
return;
}
var file = $$.file(args[0]);
if (!file.exists()) {
xprintln('[ERROR] File not exists: ' + file);
return;
}
var size = parseSize(args.val('s', 'size') || '20m');
xprintln('[INFO] Split size: ' + size);
if (size.compareTo(0) < 0) {
xprintln('[ERROR] Split file size cannot less than 0: ' + size);
return;
}
if (size.compareTo(file.length()) >= 0) {
xprintln('[ERROR] Split file size larger or equals then origin file, ' + size + ' vs ' + file.length());
return;
}
var prefix = args.val('p', 'prefix') || file.getName();
if (!prefix.endsWith('.')) { prefix += '.'; }
xprintln('[INFO] Split file prefix: ' + prefix);
var suffix = args.val('suffix') || '';
if (!suffix.startsWith('.') && ($STR(suffix) != '')) { suffix = '.' + suffix; }
xprintln('[INFO] Split file suffix: ' + (($STR(suffix) == '') ? '(empty)' : suffix));
var fileIndex = 0;
var writted = $$.num(0);
var buff = $$.byteArray(1024);
var fnList = [];
var fn = prefix + $$.numFormat('000').format(fileIndex) + suffix;
if ($$.file(fn).exists()) {
xprintln('[ERROR] File exists: ' + fn);
return;
}
fnList.push(fn);
xprintln('[INFO] Write file: ' + fn);
var os = new java.io.BufferedOutputStream(new java.io.FileOutputStream($$.file(fn)));
var is = $$.rFile(file).rStream().buffered().stream();
for (var len; ((len = is.read(buff)) != -1);) {
os.write(buff, 0, len);
writted = writted.add(len);
if (writted.compareTo(size.mul(fileIndex + 1)) >= 0) {
os.close();
fileIndex++;
if (writted.compareTo(file.length()) < 0) {
fn = prefix + $$.numFormat('000').format(fileIndex) + suffix;
fnList.push(fn);
xprintln('[INFO] Write file: ' + fn);
os = new java.io.BufferedOutputStream(new java.io.FileOutputStream($$.file(fn)));
} else {
os = null;
}
}
}
if (os != null) { os.close(); }
println();
xprintln('[OK] Use command to join file:\ncat ' + fnList.join(' \\\n ') + ' \\\n > ' + file.getName());
println();
xprintln('[INFO] Split file done!');
};
main();

31
scripts/sshkeygen.js Normal file
View File

@@ -0,0 +1,31 @@
#! /usr/bin/env runjs
var KeyPairGenerator = java.security.KeyPairGenerator;
var Bytes = Packages.me.hatter.tools.commons.bytes.Bytes;
var UnixArgsUtil = Packages.me.hatter.tools.commons.args.UnixArgsUtil;
var SSHKeyGen = Packages.me.hatter.tools.commons.security.ssh.SSHKeyGen;
var main = () => {
UnixArgsUtil.parseGlobalArgs($ARGS);
var args = UnixArgsUtil.ARGS.args();
if (UnixArgsUtil.ARGS.flags().containsAny('h', 'help')) {
println('sshkeygen.js - Generate SSH keypair.')
println();
println('sshkeygen.js [--h[elp]] [-keyLength 4096] [-serverName server_name]');
return;
}
var kpg = KeyPairGenerator.getInstance("RSA");
var keyLen = $$.asInt(UnixArgsUtil.ARGS.kvalue('keyLength') || '2048');
if (keyLen < 1024) {
println('Key length is less than 1024 bit: ' + keyLen);
return;
}
kpg.initialize(keyLen);
var kp = kpg.generateKeyPair();
println(SSHKeyGen.encodePublicKey(kp.getPublic(), UnixArgsUtil.ARGS.kvalue('serverName') || 'test@example.com'));
println(Bytes.from(kp.getPrivate().getEncoded()).asPem('PRIVATE KEY'));
};
main();

53
scripts/sync.js Normal file
View File

@@ -0,0 +1,53 @@
#! /usr/bin/env runjs
var main = () => {
if ($ARGS && ($ARGS.length > 0)) {
var userHome = $$.prop('user.home');
if ($STR($ARGS[0]) == 'md') {
if (__.stringutil.isEmpty($$.shell().commands('which', 'markdowndocs.js').start()[0])) {
xprintln('[ERROR] Command markdowndocs.js not found.');
return;
}
$$.shell().inheritIO().commands('markdowndocs.js').run();
}
if ($STR($ARGS[0]) == 'ms') {
if (__.stringutil.isEmpty($$.shell().commands('which', 'markdownslide.js').start()[0])) {
xprintln('[ERROR] Command markdownslide.js not found.');
return;
}
$$.shell().inheritIO().commands('markdownslide.js').run();
}
}
println('[INFO] 1. Git Add All');
$$.shell().inheritIO().commands('git', 'add', '.').run();
println('[INFO] 2. Git Commit All');
$$.shell().inheritIO().commands('git', 'commit', '-a', '-m', "'auto sync'").run();
println('[INFO] 3. Git Push');
var gitPushError = false;
$$.shell().commands('git', 'push').run((out, err) => {
if (err && (err.string().contains('Connection closed by remote host')) || err.string().contains('make sure you have the correct access rights')) {
xprintln('[ERROR] Git Push FAILED!');
gitPushError = true;
}
});
if (gitPushError) { return; }
println('[INFO] 4. Sync Server Repo');
var path = $$.file('.').getAbsolutePath();
var indexOfPage = path.indexOf('/page');
if (indexOfPage > 0) {
path = path.substring(0, indexOfPage);
} else {
path = path.substring(0, path.length - 2);
}
path = path.substring(path.lastIndexOf('/') + 1);
var updatePageUrl = 'https://playsecurity.org/update_pages?' + path;
try {
println($$.httpRequest().connTimeout(600).readTimeout(10000).url(updatePageUrl).get());
} catch (e) {
xprintln('[WARN] Update pages failed, try cURL mode.');
$$.shell().inheritIO().ignoreError(true).commands('curl', updatePageUrl).run();
}
};
main();

478
scripts/tinyca.js Normal file
View File

@@ -0,0 +1,478 @@
#! /usr/bin/env runjs
requireJS('component-json.js');
requireJS('component-colorprint.js');
requireJS('component-gpg.js');
requireJAR('bcpkix-jdk15on-154.jar');
requireJAR('bcprov-ext-jdk15on-154.jar');
requireJAR('bcprov-jdk15on-154.jar');
requireJAR('crypto-1.0.jar');
var StringReader = java.io.StringReader;
var BufferedReader = java.io.BufferedReader;
var TimeUnit = java.util.concurrent.TimeUnit;
var Bytes = Packages.me.hatter.tools.commons.bytes.Bytes;
var PEMUtil = Packages.me.hatter.tools.commons.security.pem.PEMUtil;
var UnixArgsUtil = Packages.me.hatter.tools.commons.args.UnixArgsUtil;
var X509CertUtil = Packages.me.hatter.tools.commons.security.cert.X509CertUtil;
var PrivateKeyParseTool = Packages.me.hatter.tools.commons.security.rsa.PrivateKeyParseTool;
var KeyPairGenerateTool = Packages.me.hatter.tools.commons.security.key.KeyPairGenerateTool;
var CertificateAuthority = Packages.me.hatter.tools.crypto.ca.CertificateAuthority;
var printHelp = () => {
println('tinyca.js - Tiny CA.')
println();
println('tinyca.js <type> <command>');
println('type - _, global, ca, intermediate, server, client');
println('command, cases below:');
println(' type = _, global - init');
println(' type = ca - create, list, delete');
println(' type = intermediate - create, list, delete');
println(' type = server - create, list, delete');
println(' type = client - create, list, delete');
println('params:');
println(' -type <rsa,ec> - RSA or EC');
println(' -keyLength <len> - Key length');
println(' -validYear <year> - Valid year(s)');
println(' -certId <certId> - Cert ID');
println(' -subject <subject> - Subject');
println(' -dnsName <name,name> - DNS name(s)');
};
var dvalue = (key) => {
var ks = key.split(/\./g);
var val = $GLOBAL();
for (var i = 0; i < ks.length; i++) {
var val2 = val[ks[i]];
if (val2 == null) { return null; }
val = val2;
}
return val;
};
var getTypeKeyLengthKeyPair = (ty) => {
var type = UnixArgsUtil.ARGS.kvalue('type', dvalue('GLOBAL_CA_CONFIG.defaults.' + ty + '.type') || dvalue('GLOBAL_CA_CONFIG.defaults._.type'));
var keyLength = UnixArgsUtil.ARGS.kvalue('keyLength', 0);
var kpt = KeyPairGenerateTool.instance();
if (type.toUpperCase() == 'RSA') {
kpt.rsa();
if (keyLength == 0) {
kpt.keyLength(dvalue('GLOBAL_CA_CONFIG.defaults.' + ty + '.keyLength.RSA') || dvalue('GLOBAL_CA_CONFIG.defaults._.keyLength.RSA'));
}
} else if (type.toUpperCase() == 'EC') {
kpt.ec();
if (keyLength == 0) {
kpt.keyLength(dvalue('GLOBAL_CA_CONFIG.defaults.' + ty + '.keyLength.EC') || dvalue('GLOBAL_CA_CONFIG.defaults._.keyLength.EC'));
}
} else {
println(colorPrint.fail.render('[FAIL]') + 'Unknown type: ' + type);
}
if (keyLength < 0) {
println(colorPrint.fail.render('[FAIL]') + 'Key length invalid: ' + keyLength);
} else if (keyLength > 0) {
kpt.keyLength(keyLength);
}
return [type, keyLength, kpt.generate()];
};
var displayLimitChars = (str) => {
if (str.length < 80) {
return str;
}
return str.substring(0, 87) + '...';
};
var listCerts = (dir) => {
$ARRAY(dir.listFiles()).forEach((d) => {
var fileCert = $$.file(d, 'cert.pem');
if (!fileCert.exists()) {
println(colorPrint.warning.render('[WARN]') + 'No cert found in: ' + d.getName());
return;
}
var certs = X509CertUtil.parseX509CertificateList($$.rFile(fileCert).bytes());
if ((certs == null) || (certs.size() == 0)) {
println(colorPrint.warning.render('[WARN]') + 'No cert found in: ' + fileCert);
return;
} else if (certs.size() > 1) {
println(colorPrint.warning.render('[WARN]') + 'More than one certs found in: ' + fileCert);
return;
}
var cert = certs.get(0);
var isValid = (cert.getNotBefore().getTime() <= $$.date().millis()) && (cert.getNotAfter().getTime() >= $$.date().millis());
println(colorPrint.bold.render('CERT ID: ')
+ colorPrint.underline.render(d.getName())
+ ' '
+ (isValid? colorPrint.okgreen.render('[VALID]'): colorPrint.okgreen.render('[EXPIRED]'))
+ (isValid? (' left ' + colorPrint.underline.render(parseInt((cert.getNotAfter().getTime() - $$.date().millis()) / TimeUnit.DAYS.toMillis(1))) + ' day(s)'): '')
);
println(' Subject : ' + cert.getSubjectDN());
println(' Issuer : ' + cert.getIssuerDN());
if ((cert.getSubjectAlternativeNames() != null) && (cert.getSubjectAlternativeNames().size() > 0)) {
println(' Alt Subject : ' + cert.getSubjectAlternativeNames());
}
println(' NotBefore : ' + cert.getNotBefore());
println(' NotAfter : ' + cert.getNotAfter());
if (UnixArgsUtil.ARGS.flags().containsAny('v', 'verbose')) {
var pkLines = $STR(cert.getPublicKey()).split("\n");
println(' PublicKey : ' + pkLines[0]);
for (var i = 1; i < pkLines.length; i++) {
println(' : ' + displayLimitChars(pkLines[i]));
}
println(' Issuer : ' + cert.getIssuerDN());
println(' Sign Alg : ' + cert.getSigAlgName());
// println(' Sign Alg OID : ' + cert.getSigAlgOID());
println(' Signature : ' + displayLimitChars(Bytes.from(cert.getSignature()).asHex()));
}
});
};
var writeCert = (kp, cert, dir) => {
var serialNo = Bytes.from(cert.getSerialNumber().toByteArray()).asHex().toUpperCase();
if (serialNo.startsWith('00')) { serialNo = serialNo.substring(2); }
var dirSerialNo = $$.file(dir, serialNo);
dirSerialNo.mkdirs();
var filePrivKey = $$.file(dirSerialNo, 'privkey.pem');
var filePrivKeyEncypted = $$.file(dirSerialNo, 'privkey.pem.asc');
var filePubKey = $$.file(dirSerialNo, 'pubkey.pem');
var fileCert = $$.file(dirSerialNo, 'cert.pem');
if (filePrivKey.exists() || filePrivKeyEncypted.exists() || filePubKey.exists() || fileCert.exists()) {
println(colorPrint.fail.render('[FAIL]') + 'Serial number already exsists: ' + serialNo);
return;
}
$$.rFile(filePrivKey).write(PEMUtil.printPEM('PRIVATE KEY', kp.getPrivate().getEncoded()));
$$.rFile(filePubKey).write(PEMUtil.printPEM('PUBLIC KEY', kp.getPublic().getEncoded()));
$$.rFile(fileCert).write(PEMUtil.printPEM('CERTIFICATE', cert.getEncoded()));
gpgEncryptArmor(dvalue('GLOBAL_CA_CONFIG.gpgKeyId') || '6FAFC0E0170985AA71545483C794B1646A886CD6', filePrivKey.getPath(), filePrivKeyEncypted.getPath());
if (!filePrivKeyEncypted.exists()) {
println(colorPrint.fail.render('[FAIL]') + 'Encrypt private key failed: ' + filePrivKey);
return;
}
filePrivKey.delete();
if (UnixArgsUtil.ARGS.flags().containsAny('v', 'verbose')) {
println('[INFO] Public key:');
println(kp.getPublic());
println('[INFO] Certificate:');
println(cert);
}
println(colorPrint.okgreen.render('[SUCCESS]') + 'Certificate created: ' + serialNo + ' ---> ' + dir);
};
var defaultCA_JSON = {
"name": "My Private CA",
"gpgKeyId": "6FAFC0E0170985AA71545483C794B1646A886CD6",
"dirs": {
"CA": "ca",
"INTERMEDATE": "intermediate",
"SERVER": "server",
"CLIENT": "client"
},
"defaults": {
"_": {
"type": "EC",
"keyLength": {
"RSA": 2048,
"EC": 256
},
"validYear": 5
},
"ca": {
"type": "EC",
"keyLength": {
"RSA": 4096,
"EC": 384
},
"validYear": 100
},
"intermediate": {
"validYear": 10
}
}
};
var main = () => {
UnixArgsUtil.parseGlobalArgs($ARGS);
var args = UnixArgsUtil.ARGS.args();
if (args == null || args.length != 2) {
printHelp();
return;
}
var type = $STR(args[0]);
var command = $STR(args[1]);
if (((type == '_') || (type == 'global')) && (command == 'init')) {
if ($$.file('ca.json').exists()) {
// println(colorPrint.okblue.render('[OK]') + 'File: ca.json already exists.');
} else {
$$.rFile('ca.json').write(prettyJSON(defaultCA_JSON));
println(colorPrint.okgreen.render('[SUCCESS]') + 'File: ca.json created.');
}
}
if (!$$.file('ca.json').exists()) {
println('No file ca.json found!');
println('');
println('Please create ca.json first:');
println(prettyJSON(defaultCA_JSON));
return;
}
GLOBAL_CA_CONFIG = JSON.parse($$.rFile('ca.json').string());
println('::::::Tiny CA programme: ' + (dvalue('GLOBAL_CA_CONFIG.name') || 'Unnamed CA') + ':');
if ((type == '_') || (type == 'global')) {
if (command == 'init') {
var tobeCreatedDirs = [dvalue('GLOBAL_CA_CONFIG.dirs.CA') || 'ca',
dvalue('GLOBAL_CA_CONFIG.dirs.INTERMEDATE') || 'intermediate',
dvalue('GLOBAL_CA_CONFIG.dirs.SERVER') || 'server',
dvalue('GLOBAL_CA_CONFIG.dirs.CLIENT') || 'client'];
tobeCreatedDirs.forEach((e) => {
var f = $$.file(e);
if (f.exists()) {
if (f.isDirectory()) {
println(colorPrint.okblue.render('[OK]') + 'Directory: ' + e + ' already exists.');
} else {
println(colorPrint.fail.render('[FAIL]') + 'File?: ' + e + ' exists, but not directory!');
}
} else {
f.mkdirs();
println(colorPrint.okgreen.render('[SUCCESS]') + 'Directory: ' + e + ' created.');
}
});
println(colorPrint.okgreen.render('[DONE]') + 'Global init finished.');
} else if (command == 'list') {
println('[CA]' + ' list:');
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.CA') || 'ca'));
println();
println('[INTERMEDIATE]' + ' list:');
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.INTERMEDIATE') || 'intermediate'));
println();
println('[SERVER]' + ' list:');
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.SERVER') || 'server'));
println();
println('[CLIENT]' + ' list:');
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.CLIENT') || 'client'));
}
} else if (type == 'ca') {
if (command == 'create') {
var typeKeyLengthKP = getTypeKeyLengthKeyPair('ca');
var type = typeKeyLengthKP[0];
var keyLength = typeKeyLengthKP[1];
var kp = typeKeyLengthKP[2];
var subject = UnixArgsUtil.ARGS.kvalue('subject', '').replaceAll('__', ' ');
if (subject == '') {
println(colorPrint.fail.render('[FAIL]') + 'Subject cannot be null.');
return;
}
var validYear = UnixArgsUtil.ARGS.kvalue('validYear', dvalue('GLOBAL_CA_CONFIG.defaults.ca.validYear') || dvalue('GLOBAL_CA_CONFIG.defaults._.validYear') || 100);
var cert = CertificateAuthority
.instance()
.validYears(validYear)
.subject(subject)
.certPubKey(kp.getPublic())
.signPrivKey(kp.getPrivate())
.createCA();
writeCert(kp, cert, dvalue('GLOBAL_CA_CONFIG.dirs.CA') || 'ca');
} else if (command == 'list') {
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.CA') || 'ca'));
} else if (command == 'delete') {
println(colorPrint.fail.render('[FAIL]') + 'Not implemented: ' + command);
} else {
println(colorPrint.fail.render('[FAIL]') + 'Unknow command: ' + command);
printHelp();
}
} else if (type == 'intermediate') {
if (command == 'create') {
var typeKeyLengthKP = getTypeKeyLengthKeyPair('intermediate');
var type = typeKeyLengthKP[0];
var keyLength = typeKeyLengthKP[1];
var kp = typeKeyLengthKP[2];
var subject = UnixArgsUtil.ARGS.kvalue('subject', '').replaceAll('__', ' ');
if (subject == '') {
println(colorPrint.fail.render('[FAIL]') + 'Subject cannot be null.');
return;
}
var validYear = UnixArgsUtil.ARGS.kvalue('validYear', dvalue('GLOBAL_CA_CONFIG.defaults.intermediate.validYear') || dvalue('GLOBAL_CA_CONFIG.defaults._.validYear') || 20);
var certId = UnixArgsUtil.ARGS.kvalue('certId');
if (certId == null) {
println(colorPrint.fail.render('[FAIL]') + 'Cert ID cannot be null.');
return;
}
var dirCA = $$.file(dvalue('GLOBAL_CA_CONFIG.dirs.CA') || 'ca');
var fileCACert = $$.file(dirCA, certId, "cert.pem");
var fileCAPrivKeyEncrypted = $$.file(dirCA, certId, "privkey.pem.asc");
if (!(fileCACert.exists()) || !fileCAPrivKeyEncrypted.exists()) {
println(colorPrint.fail.render('[FAIL]') + 'Cert ID not exists: ' + certId);
return;
}
var signCert = X509CertUtil.parseX509CertificateList($$.rFile(fileCACert).bytes()).get(0);
var privKeyVal;
try {
privKeyVal = gpgDecrypt(fileCAPrivKeyEncrypted.getPath());
} catch(ex) {
println(colorPrint.fail.render('[FAIL]') + 'Decrypt private key failed: ' + fileCAPrivKeyEncrypted);
return;
}
var signPrivKey = new PrivateKeyParseTool(new BufferedReader(new StringReader(privKeyVal))).read();
var cert = CertificateAuthority
.instance()
.validYears(validYear)
.subject(subject)
.certPubKey(kp.getPublic())
.signCert(signCert)
.signPrivKey(signPrivKey)
.createIntermediateCert();
writeCert(kp, cert, dvalue('GLOBAL_CA_CONFIG.dirs.INTERMEDATE') || 'intermediate');
} else if (command == 'list') {
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.INTERMEDATE') || 'intermediate'));
} else if (command == 'delete') {
println(colorPrint.fail.render('[FAIL]') + 'Not implemented: ' + command);
} else {
println(colorPrint.fail.render('[FAIL]') + 'Unknow command: ' + command);
printHelp();
}
} else if (type == 'server') {
if (command == 'create') {
var typeKeyLengthKP = getTypeKeyLengthKeyPair('server');
var type = typeKeyLengthKP[0];
var keyLength = typeKeyLengthKP[1];
var kp = typeKeyLengthKP[2];
var subject = UnixArgsUtil.ARGS.kvalue('subject', '').replaceAll('__', ' ');
if (subject == '') {
println(colorPrint.fail.render('[FAIL]') + 'Subject cannot be null.');
return;
}
var dnsName = UnixArgsUtil.ARGS.kvalue('dnsName', '');
if (dnsName == '') {
println(colorPrint.fail.render('[FAIL]') + 'DNSName cannot be null.');
return;
}
var validYear = UnixArgsUtil.ARGS.kvalue('validYear', dvalue('GLOBAL_CA_CONFIG.defaults.client.validYear') || dvalue('GLOBAL_CA_CONFIG.defaults._.validYear') || 5);
var certId = UnixArgsUtil.ARGS.kvalue('certId');
if (certId == null) {
println(colorPrint.fail.render('[FAIL]') + 'Cert ID cannot be null.');
return;
}
var dirCA = $$.file(dvalue('GLOBAL_CA_CONFIG.dirs.CA') || 'ca');
var dirIntermediate = $$.file(dvalue('GLOBAL_CA_CONFIG.dirs.INTERMEDATE') || 'intermediate');
var fileCACert;
var fileCAPrivKeyEncrypted;
if ($$.file(dirIntermediate, certId, "cert.pem").exists()) {
fileCACert = $$.file(dirIntermediate, certId, "cert.pem");
fileCAPrivKeyEncrypted = $$.file(dirIntermediate, certId, "privkey.pem.asc");
} else {
fileCACert = $$.file(dirCA, certId, "cert.pem");
fileCAPrivKeyEncrypted = $$.file(dirCA, certId, "privkey.pem.asc");
}
if (!(fileCACert.exists()) || !fileCAPrivKeyEncrypted.exists()) {
println(colorPrint.fail.render('[FAIL]') + 'Cert ID not exists: ' + certId);
return;
}
var signCert = X509CertUtil.parseX509CertificateList($$.rFile(fileCACert).string()).get(0);
var privKeyVal;
try {
privKeyVal = gpgDecrypt(fileCAPrivKeyEncrypted.getPath());
} catch(ex) {
println(colorPrint.fail.render('[FAIL]') + 'Decrypt private key failed: ' + fileCAPrivKeyEncrypted);
return;
}
var signPrivKey = new PrivateKeyParseTool(new BufferedReader(new StringReader(privKeyVal))).read();
var cert = CertificateAuthority
.instance()
.validYears(validYear)
.subject(subject)
.certPubKey(kp.getPublic())
.signCert(signCert)
.signPrivKey(signPrivKey)
.createServerCert($$.asList(dnsName.split(/,/g)));
writeCert(kp, cert, dvalue('GLOBAL_CA_CONFIG.dirs.SERVER') || 'server');
} else if (command == 'list') {
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.SERVER') || 'server'));
} else if (command == 'delete') {
println(colorPrint.fail.render('[FAIL]') + 'Not implemented: ' + command);
} else {
println(colorPrint.fail.render('[FAIL]') + 'Unknow command: ' + command);
printHelp();
}
} else if (type == 'client') {
if (command == 'create') {
var typeKeyLengthKP = getTypeKeyLengthKeyPair('client');
var type = typeKeyLengthKP[0];
var keyLength = typeKeyLengthKP[1];
var kp = typeKeyLengthKP[2];
var subject = UnixArgsUtil.ARGS.kvalue('subject', '').replaceAll('__', ' ');
if (subject == '') {
println(colorPrint.fail.render('[FAIL]') + 'Subject cannot be null.');
return;
}
var validYear = UnixArgsUtil.ARGS.kvalue('validYear', dvalue('GLOBAL_CA_CONFIG.defaults.client.validYear') || dvalue('GLOBAL_CA_CONFIG.defaults._.validYear') || 5);
var certId = UnixArgsUtil.ARGS.kvalue('certId');
if (certId == null) {
println(colorPrint.fail.render('[FAIL]') + 'Cert ID cannot be null.');
return;
}
var dirCA = $$.file(dvalue('GLOBAL_CA_CONFIG.dirs.CA') || 'ca');
var dirIntermediate = $$.file(dvalue('GLOBAL_CA_CONFIG.dirs.INTERMEDATE') || 'intermediate');
var fileCACert;
var fileCAPrivKeyEncrypted;
if ($$.file(dirIntermediate, certId, "cert.pem").exists()) {
fileCACert = $$.file(dirIntermediate, certId, "cert.pem");
fileCAPrivKeyEncrypted = $$.file(dirIntermediate, certId, "privkey.pem.asc");
} else {
fileCACert = $$.file(dirCA, certId, "cert.pem");
fileCAPrivKeyEncrypted = $$.file(dirCA, certId, "privkey.pem.asc");
}
if (!(fileCACert.exists()) || !fileCAPrivKeyEncrypted.exists()) {
println(colorPrint.fail.render('[FAIL]') + 'Cert ID not exists: ' + certId);
return;
}
var signCert = X509CertUtil.parseX509CertificateList($$.rFile(fileCACert).bytes()).get(0);
var privKeyVal;
try {
privKeyVal = gpgDecrypt(fileCAPrivKeyEncrypted.getPath());
} catch(ex) {
println(colorPrint.fail.render('[FAIL]') + 'Decrypt private key failed: ' + fileCAPrivKeyEncrypted);
return;
}
var signPrivKey = new PrivateKeyParseTool(new BufferedReader(new StringReader(privKeyVal))).read();
var cert = CertificateAuthority
.instance()
.validYears(validYear)
.subject(subject)
.certPubKey(kp.getPublic())
.signCert(signCert)
.signPrivKey(signPrivKey)
.createClientCert();
writeCert(kp, cert, dvalue('GLOBAL_CA_CONFIG.dirs.CLIENT') || 'client');
} else if (command == 'list') {
listCerts($$.file(dvalue('GLOBAL_CA_CONFIG.dirs.CLIENT') || 'client'));
} else if (command == 'delete') {
println(colorPrint.fail.render('[FAIL]') + 'Not implemented: ' + command);
} else {
println(colorPrint.fail.render('[FAIL]') + 'Unknow command: ' + command);
printHelp();
}
}
};
main();

25
scripts/trash.js Normal file
View File

@@ -0,0 +1,25 @@
#! /usr/bin/env runjs
var argsjs = require('component-args.js');
var main = () => {
var args = argsjs.parseDefARGs();
if (args.length == 0) {
xprintln('[ERROR] Need args.');
return;
}
$ARR(args).forEach((f) => {
var fi = $$.file(f);
if (!(fi.exists())) {
xprintln('[WARN] File not exists: ' + f);
} else {
var fn = fi.getName();
var trashDestFile = $$.file('~/.Trash/', fn + ".removed." + $$.date().fmt('yyyy_MM_dd_HH_mm_ss_SSSS').format($$.date().today()));
xprintln('[INFO] Move file: ' + fi + ' --> ' + trashDestFile);
java.nio.file.Files.move(fi.toPath(), trashDestFile.toPath());
}
});
};
main();

65
scripts/updatelibs.js Normal file
View File

@@ -0,0 +1,65 @@
#! /usr/bin/env runjs
var RFile = Packages.me.hatter.tools.commons.io.RFile;
var REPO = 'https://repo.examp1e.org/';
var HPKP = 'YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=';
var main = () => {
var libDir = $$.file('lib').exists()? $$.file('lib'): $$.file('libs');
if (!libDir.exists()) {
xprintln('[ERROR] Dir lib or libs not exists!');
return;
}
println('- Load file: ' + REPO + 'files.js');
var filesJS = $STR($$.httpTool().hpkp(HPKP).url(REPO + 'files.js').read());
var filesJSON = JSON.parse(filesJS.substring(filesJS.indexOf('[')));
var filesSha1Map = filesJSON.toMap((e) => {
return [e[2], e[3]];
});
var filesSizeMap = filesJSON.toMap((e) => {
return [e[2], e[0]];
});
var fileUpdated = [];
$ARRAY(libDir.list()).forEach((f) => {
var fn = $STR(f);
var remoteFnSha1 = $STR(filesSha1Map.get(fn));
if (remoteFnSha1 == null) {
println('- SKIP file: ' + f);
return;
}
var fi = $$.file(libDir, f);
var fiSha1 = $STR($$.digests().sha1().digest(RFile.from(fi).bytes()).asHex());
if (fiSha1 == remoteFnSha1) {
println('- SHA1 check success: ' + f);
} else {
println('+ SHA1 check failed: ' + f);
println('++ REMOTE:' + remoteFnSha1 + ' LOCAL: ' + fiSha1);
println('++ Load file from: ' + REPO + f + ', size: ' + filesSizeMap.get(fn));
var counter = new Packages.me.hatter.tools.commons.io.DefaultRollCounter().prefix('++ Downloading: ');
var fBytes = $$.httpTool().hpkp(HPKP).url(REPO + f).readBytes(counter);
var downloadSha1 = $STR($$.digests().sha1().digest(fBytes).asHex());
if (downloadSha1 == remoteFnSha1) {
fileUpdated.push(fn + ' - ' + remoteFnSha1);
RFile.from(fi).write(fBytes);
} else {
println('+ ERROR! SHA1 mis-match, Should be: ' + remoteFnSha1 + ', Actural is: ' + downloadSha1);
}
}
});
if (fileUpdated.length > 0) {
println();
println('Total ' + fileUpdated.length + ' file(s) updated:');
fileUpdated.forEach((f) => {
println('- ' + f);
});
}
};
main();

37
scripts/viewjson.js Normal file
View File

@@ -0,0 +1,37 @@
#! /usr/bin/env runjs
var argsEx = require('component-args.js');
var System = java.lang.System;
var FastJSON = Packages.com.alibaba.fastjson.JSON;
var RStream = Packages.me.hatter.tools.commons.io.RStream;
var main = () => {
var args = argsEx.parseDefARGs(['h', 'help', 'n']);
if (args.flg('h', 'help')) {
println('viewjson.js [FLAGS] [FILENAME]');
println(' -h, --help Print help');
println(' -n Do not print new line at last')
return;
}
var json = null;
if (args.length < 1) {
json = RStream.from(System.in).string();
} else {
var j = $$.file(args[0]);
if (!(j.exists())) {
xprintln('[ERROR] File not exists: ' + j);
return;
}
json = $$.rFile(j).string();
}
try {
var formatedJSON = FastJSON.toJSONString($$.parseJSON(json), true).replaceAll('\t', ' ');
if (args.flg('n')) { print(formatedJSON) } else { println(formatedJSON); }
} catch (e) {
xprintln('[ERROR] Parse JSON failed.');
}
};
main();