devicely 2.0.12 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/devicely.js +1 -1
- package/lib/.env.example +20 -0
- package/lib/androidDeviceDetection.js +1 -1
- package/lib/appMappings.js +1 -1
- package/lib/deviceDetection.js +1 -1
- package/lib/devices.js +1 -1
- package/lib/doctor.js +1 -1
- package/lib/executor.js +1 -1
- package/lib/frontend/static/js/main.96600727.js +3 -1
- package/lib/logger.js +1 -1
- package/lib/server.js +1 -1
- package/package.json +7 -2
- package/scripts/shell/android_device_control.enc +1 -0
- package/scripts/shell/connect_android_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_android_wireless.enc +1 -0
- package/scripts/shell/connect_android_wireless_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -0
- package/scripts/shell/ios_device_control.enc +1 -0
- package/config/apps_presets.conf +0 -271
- package/config/devices.conf +0 -24
- package/scripts/shell/android_device_control.sh +0 -67
- package/scripts/shell/connect_android_usb_multi_final.sh +0 -67
- package/scripts/shell/connect_android_wireless.sh +0 -67
- package/scripts/shell/connect_android_wireless_multi_final.sh +0 -67
- package/scripts/shell/connect_ios_usb_multi_final.sh +0 -67
- package/scripts/shell/connect_ios_wireless_multi_final.sh +0 -67
- package/scripts/shell/create_production_scripts.sh +0 -67
- package/scripts/shell/install_uiautomator2.sh +0 -67
- package/scripts/shell/ios_device_control.sh +0 -67
- package/scripts/shell/organize_project.sh +0 -67
- package/scripts/shell/pre-publish-check.sh +0 -67
- package/scripts/shell/publish-to-npm.sh +0 -67
- package/scripts/shell/publish.sh +0 -67
- package/scripts/shell/setup.sh +0 -67
- package/scripts/shell/start.sh +0 -67
- package/scripts/shell/sync-to-npm-package-final.sh +0 -67
- package/scripts/shell/sync-to-npm-package.sh +0 -67
- package/scripts/shell/test-local-package.sh +0 -67
- package/scripts/shell/verify-shell-protection.sh +0 -67
package/scripts/shell/setup.sh
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'b49a339db21eaaa0f1c2bb5707e67018',
|
|
33
|
-
content: 'f2f91a9f71ffeb427830105521d5f05f6f67e81f29f39071d927d80030aa8299aa8c73b179eec6571308b8ddfd95dc588ce3d4ea91c7c42c7f0cd2a893689aa0fef181531512ef80397d54733776eddebbec506c9574bb17605da110122232ee314183010047876ef49b097cd002713919a2f49b4e3c512af15aa795c81c700c842371922f85176682af5025b85e6ac55ad5903a55fdd75d00dc0b29914348244d20767887c76e38ba504c7e2bf9c2e43ae5b087f1b48e44f4872bd50f269f64697def9bdcb55c1a0b7a7e2cbbd1ba15be3de2de02987370a8566256543c3d13813c070a68fa2c76fd8819ade735d5f37c257066257e5dd4f04f94cd18e607a29f957e03a9cccb3cd8b0e2a34a3c93b230628b0cbd44af72c4af0f27da1db1c330744771962214b8c316dc9bba2927d61ca2615bc8439a898f5147c02872e0eee9a6ddc3205fdc832912673a19a11a3565f01302407648169b9fed549ce9cfeaa24b91ffc746199102ae45c7d467d540b8235783900bdd3904cc48398a83e5309192b8bdce73e3e897fed525e8abcd03945ebf48971f778c6310fc84730a17e9c5094e5279d09616404bd13c54156b2a1e7441a737daacdf2584ab7e4a2f6ad3b5393362934fd9c99a607653dc393f9f23ab65a25bd684bf6e50f9f44a61b40b27010ff3cc7daca87cde01801e583179355b220d5b0cd007e6c8e4263e827f46750b639ee5b42a4283ad68d90b61db7d8547d976b63724f62fd6837dd7cc41bbbf20b52023fbdc0c971f03632c2e8a26e5a35d2b6e200f506482c4ca307ade3e48b1efa97375c0fa70a1d02628681f891873768afff909c0ff5b7e34202bf9c149dbb10359aee85bd2b6f8278103dc8511b1d4637c1d56f3afabc997d94d0be40199e742f667918498b2df1a810a59eece93396acfdc02e5d27baadc8c9fc57d3eef996274da8cfbf5528f3175de96bb3fb43481b6e3bffad21e603a324297f61c22db06f4fca58704515d054ef1d3701baa96d72d887891d1a24f6b88b57414c3fed85b2c644bc294a1605a2767ca3857e711bbd83e77e50aa7f59f28a274b2dfedc6e1b8564b2816ad78f2734cf21ff642a688c724140cae0bf60ca1061c03af5fb7c29180b910007589bd36306297e342a28e9ca04c3814dc341897e1d6e91fd2080dcf6e43120e83bd6ac3a3ed469c34bbad91f2f316b506ddc3691ab484d640bc95d5103d483a0947c6680e1ee8e19c9b6ec36ef785bc784c4fb43b232479cb7dcb9a3b711cc2cb91bbee36059124596faefd35c5a832488ef43518787a54a35d13680482d604b94edf42dff2edce601fde24d9327182c9e896b5e9d376d3ff5ec312e99e58c752f34e7cf4fec754a71a9f53bedf5a359019a6cede8f4477439b89be03dbfc1185effd9f34c1f542b3c7e60ddae59864f12f3f3679a59b960b3d497af9d1bcd783370a77681adce5f0a5e8587329004368f313d5770900d636360b643596799aa6a1d396922f79f0ab291821e85c784049d25f2ecaf16f9fa35d4ca97fa13b3aa17c18a3a1e4e107de6456d0d7ed0374c7aba6dc8a8cd9428be18e25ebc2cdc1e4b94b3f3daf9789f48e259ee00b0e9cf5454a6d52e11cb78451748b133d12019aa5ce58f1d8bc0edab84cd491ded2888ff7614c3fefcfff26cde921e60b088c70ca0665dc42bb1733d83880da25bd6d95690373f36170e3919bfc9ce145709be6a5ef4148ac2e3058635e7715b6b2045c5ce97c1398d56c14e39491a11c30956287f90dcca314d94d48ce0ea3e016320fb71b21ed936066fac65222e1b97a28b7fdec57cd1bc2a4907b293b808e2ff0023815a7c8b4342068387ee62c5b701d3ce3c595c4dc120104ab351656aa528f811dc32ba4631b1558c56ddd15e18e0d6db7983de68f55287247aa31656ad842d2c9004f335bac475586a8a2fb5086314c1c95036cd20f6646bdc56c76136b37865896eeef4951569c0fdda44c57152c991df578fb5463196f987400342734e5ab3ee50d428176c0726ce9295a8669a307fcf2fc09a2ebc13092b11f9939f846070bf1186258a3895f42b2948776e5c27f9821f0ccc594d53b1683fa33a749ea442f1f5bbe35a8941e76c4c56736b8c7851ef85148a3ce9286548b642d044ee697c782c37dde2dc90dffe37c1594669f4c3e0248ef63563ee2c7a9b021ecc81cba227c7b7ec4a087111bc11129fb4330fa392612c44e846c270b7f86b24353c15dccf24bccfaaa7eb6ad504bcf007083f39b50a57e8e7ddabc8ffc44054d630eba841ff2c1a654a45daf10cbac2f8544469b2724a0d5d0e0f8a5d5c3afad61b076de2796781a7d98936bf765fc3fb9260f2d686221dd18317324a5532495aa2f00089662c7f5adaa904d15061e2d3ea5dc931c426ee101403374a1ed84240bdc3ebc3b16aae87b99461c617bef88fdaae01ec70fd0f738257d74b76e77076b915bad4f40cd3a53744dc70c614493539b708c338f5f5d9a97e8ec70449e4cd6a2f9644ad933359d5058d23dedb6ed0417e21860a4066868b79f29801472d76a229b6f52e9a8af2e275bf95d09de35da5164eb9a3fadbc7d3528e8035720548b75397eb4cbc7117e76730efddca1b5b41d83cc5db22a198b0fd33d5c1609f81bc1e35ffd3407ffd7849bbbe6451278fb7aa463c886ea864739d16b33b9a5e7715e97ddc2e9adce045288806bc0c01018fbbc15e3ebe99c6a820ece7c3a67d2c4e9dea4f965a9af73e61c127d1fe20b60447454504f066714f1af237616bc380e2349fd01643e10237524c61548e49cf77ef4dcdacdc01f747f4ee08c24a66cab107d07491daf6b411865d9bcb09ca0482bcd32b63525b8a5c7c50e2f992be65f865b21453c0916f756f55de1eeed3ee3721ac231517aefe5b2291dc6e353dcd497a803a620852d73e9eaf794745997f14487b2ee03defa534df5567b98fa2d2280d0fae534d90ed4d33efa3f91136c0776cd30b2fd9fa070e8d4ab40b26ce8de74cfd7095694e77262b23020c8336b30cca246a848ee85b8131e50a3839d65092e29a32045d9103789a3333fcb33040b3b06ef2bd0fe053fe7758c0e571071ce7e1c0811c561a6b5d8ac5bf4cb4269addb8de820fa0f91e55a81b5e7bc5bf77d9bd2a3a88ee91690d300055ec134fe0964f4c170ca27a9774fa3490b4fd43afb75535512ab6fa465eafaf40ef36586332de6d5089c43f17c2d743bdec1db0ce1c357c63b6cff09824614729605af5bb204966e20adf50c6307c3358ae3b085d595e4076cf9b2bc8bd6148a05ca820b05e57e8f2ca5e696a01eb30976c77fddbf1a42e8b37e0d0c64d86d08e3e62675ea81f226170ee10a5bb32541c90941967b9ebdcf194f948dda7ad86396cc327eba933c352fc36dc30ac629c0b1f346027fdb78073232a9000ff6573c5f425f1ed6d6d4117b3b8cb34980ef8f85cb7a4f983014ba00cc9c52194a5c06dc29fd5379e92d4361d3a826751c4de5031f37066afa8fb49af21ac238059350098fd771dfe8a1dec32cfcb62e403095a7b8311609bc709d75f7835475bc4d6d8d3ece4b45ecc0e5e26cff90eda06a778d8e1b05c57a9a24c523d99777126d4ee6d44783a428463f290c0fb5af7b6568339de0e52b47f5d86d549484ae96594b0d64e2fa3db73a345c2eb931245236a93900afa84a91ccb683c6a27f7ec47cf2d562dd6ab68b92d6466ac5ec9a359b8c255cb422fe29f4f10b6ec43dc972149f2fd57071d8553d405a10ddf632244021b4aa507d9347f5edc5c83cf62ca37dff8f6e4eb7fb21b9bce5ee9da3ed9cbef4a07ea4104876e2e9a60829d0bd60d6eef69c492f59eb0fdb4dc43328523f8d7a14012493165a68b22f341d291c4d1f99cabb96b0835e8fa2ece8932b8925563a85d5d11d8c2a60563d8a2bb9dbf34211287f0a94938f33c861020bb139f3a5d74b62b288096266cf9e633c7d13d8bdc1fdbb3cca6704a4947192001577d39c24ca458339fea6f359007c32023aaa10b13760251a2c831c27ec4b75c2c2c7b981ed394faeb4dcde4fe623f67f6f9b440e58e904a690ac627c34bbd25c8768c6075e15a66413f422ea0b007e8dab4b76a0f312e2060df0350b87a5651802658b8f05cdc91e221c2d5df2a23a31686420f1fc3ac405c99b79f57275270214aad95e38a235abeda1dab7fbb4e948575eadc0a75d9c9d9ab72cfaff21c77a46036152686f8ef60a579996f2a81c34b6a080a5f84c900dbfe2d968b4f75d22af790e55a58b7c53e91933a469fa839dbe03309c0694ea329c7b7316dd19865031bf34036bebc7c09bf2c6ea3ed956ddf3a2a96820c6ec4def53f0159196907fdf4d309c9f6405c3e87d000d6818f75c6af2cb52509f8ffa198e833e3a6ab3e1d7221d67cca79890f6e9228ab0e84ad5ef202040864ad53a57c3f0de60984d6b0f254bd2771807b8c7a1afff811fe08795bf3e6fa8ac0ec7646769881774d3732a13b61d05743448377d598b5a21ea1bd8f8016d9dcc123842fbfc2994909fba2e756b462ebad29f2f8d5ddfcc83d7efe2cfec7c723ecb70c09d27bf9287f2c41a825a08ff6b48ed6ff0977a7b0cb03904377659111cc393c035e2eb358e3de72a7c2dbedbc1b1f8623d472f1a9561c498fe5cce0544911a5eea589ffd9dad9da13bb048ff549d2cfcd68a3f039432ffa758b0a73e6ba013af744aa054650a63ceec92a67c67e27a62fc83a78cdbe2d8d74b7ed3a02089e1f3bb126ddad01c9c5848951a5d7bb5023a3d2242394096b93e'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
package/scripts/shell/start.sh
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'e21ec4c4b961f0c0a2c4ba296ea1d4e7',
|
|
33
|
-
content: '8df9f96bc5adfc888872649a91089c73164baad1afc3e13466d2ad5481342930b4bba0204c57b1eb58eda4590c9cb0283a36916b3f980afb082e0c0e2e5767c9b13a9a67559b336fff06205afd32d986f1de8058c3ec3645aa31210af8d7bf7bd38ff8977bf78d15a900ba998ac1bed8bddee1a95858dac8c18fe1a259e18f1dfff64f9c5e4d6b6329bd31ccfb30ebe06d9b5d8488bd4c5ee333efb4d7bc2daf7b5d3ee525f5dbbc558b6d7de157f50e785755de7706aac7a5ec0f59665672ab6d627793073b83d386aad20bb042908b72c857212b1c168eda33fce6f91ba825685c3bf8b8de6cea49ea92e34fd61e8c1a208cc9ae84710809bdf50bb474083cf15ccf50fad702b738aa4e46d8d37b70256d543437d8efc913cc6b35b56b45b3b8ef9362226a15d3a701a4dc460b71b7e8ed754fc48505a5608fe9a453ebb7dbfffeeec5cd3cd12eb68e217fcd01c3aedb7f4f0a9715e1b5dec68dc635fab34d0b66108c3c1a14233e8c235320d5624d62d1b02000516f450ea8eed5b57c2c70817c21e0129eec2f5097a515bd69106e83cbe351427f6c1ba405cb447cfbe3dd0653c9e634be014c570689cec60f09bf81a31d77922c8bbc256ea4632f02a0fcfe6fafeab1528ceace696a05e1caadf6942a823a7d17f58c7bf042e5d40af0d01704752eaba57579eac688365089350bc7e4b788c6bd6fa92b52694c701e9c1ac67a1aa439eb1365936cbcfa73364840c79e78f957524078782f6a87df2b7dc89e9620c5cfa1068e8630eb779e19255e28a8796c2964e8c76a1b571dc3aaf31e4524409b5c8a5bd6db56605bd3ba3ae2fe365981e21dfc135d257e378756347182629253c3a8b1f05439d3c90f042626c89f5e75cea068e30060cb6035c10672218d9c853ead99a56702ecc85ec489a05b0091d36103c5ea3660f2ef24b9a3e670c36fa3ef2f1121ca3cf925c6554b7282800e948ee987accbda457708afce7382fdfa37aec1f40323bfecc64304ff1009eb25cccb84b956cc799e67cc296ef9c0dbd886c48ad3e76a5cda6ce3f25ae0c8aedd142e8dfcb7a357b837e03bccd85eb95a08058af230071122192abbb2b69560ee2473e0dd162a6f9d74d14f36cb9489c1ec50b233807083344dae92bd96781f7e4f3d5d09feee89e077fa62ac84835452b76961a8a1e0491e9a80cd006464d2d9d4bce43535d8f3b9a7e999e1f5780c34633936e5b44fef2914ae6f6b2227ba9ad0ff6e170422c119ff9d20c91095b517050d726c00c88ea5f93f6c0a9a7b4e7c44f1b91daef5e8c0ed3d1a06c42422f1ea37c1d795273c52259cbaa3e4c8043427d47a6974cfca5c01a11cc92efb49031df599f1f8416a560d91a43b3782764332be184c7107629ffee361557edd312498e484ed9374d668d2693a0d0bc25ab1dd6259d598e5b998a50eb022e590d0d3d9e81f25eab08dd6b4c4b0cfd0cf217d6ce78557a76f2d837ad87efa86c0b8810fcee249f706f009f558c143a85b5ca76c4ddd333a44d8b42579bcc1308948aadeed98bd00323168893c5715c7db25d2b759887085a95c11cebd96378089aa741b3d8ab5deb45b2d064d5b42859b0972e45cc4cbcd8272552d359590090ec7e2649a317c6e71b46aed572391459534953308e4b1fb86bd7d963f4dd34cc193176b81eca05be51d21bd7d8ac6188703c2451400f064ef73a87ca2c90bb412b1878647cb7be26956de804ddd91a4ac67966b78da1e2c0e29be06716ec740cd6a74f371ec7038cf688419dd241bb3356cf500320c3f462437051dd0062a63f2a3e7fdd1a724f398a0f5e972cdb04bf2fa6c5680f02efb2e70088305bb72156ac8cf379f6e2c64a2ea59273ca57740cb1cd38ea190a98c32f51a6f3aa6710ad41af3450be81350112f5a076de3e4de9dbe18373c03288956f070a8d7d34a1bc9dbb00aea3b32f8bfd2dfcfc571d4909486630b389109410994447816caa4d86f0fe773a5ecf473283929fcd6b918b3d7b6d4cc1a4f9f66da5cbb49cdc620306ab6da8be6ad901416bf05458f9e5f8dd972c9d751fe31aa3a0ba82298a890ddeaec9be6d41aaa5bb4a8e587118b4433ef5f917ff8de772f5fcbdf870005d9e6aefa8644c2ac33992677f30253ecd35405278cca948f54b2d84f2693cd7ff43ca8c0dd63a5b24eae9f9537104e909d6f'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '084f499fdb711bfa5e5420e643d83e98',
|
|
33
|
-
content: 'dbeb58824dda43f620660ff7df1836fccd65f605e357c278ca17518ad195dfa4f0d3a33e2fd37597dddefef82e894928324d362ad4fa05758953e5c6f2c22314754aa3ebfe9287cc14af3f3f38fa27db49aa30f11ec6b1b73863163edef9dd028dbdf3750a471ff77816c24a1b7082ecfa5f15bf31f8217a2e52c4181d347aea76eaeb31d193d49da604f369f425c8f2046c061f2a107b4ec5c01c7678a44b4a02773935aa83689bdbc697ea23e82a2e716afd763d6e5172efe0c159a1d963310338e5862b4bee023b99eeefffe037aff5fb7b9a7b66ba0d6e3d8fa2cfe08137b7652d5ca56dd747dd1456f172dd5e94a5aa31dcd565e807887e2abaeba811b21f1b20d5d70a0d4a4972bb40b40db1b9958214f9a83af2b52c736a81ef3137ef485b665873b7c304282847199ca8afb563e969f73ca5e5b6139e65d4e9cdd5ed42efddcfe982a95b5aa49e30dae80df18c7667d909c5645004769b9a35b5ad33b45102327136bab64cb011b92657cda5593ccbe3d0c3414cb73ac8495228134dd9ccfb5168c5bd88b3697c13e5d58b67a13b8046fbee68351326b5f9c6b92f066d95fc7820bfcaec0f0f4d492c0cc937dbc36d5d82790264f750e1cff418d8c554a7ba51dc1ef0644cc0f85c0c765bacc3b5b86ebd7ee0fe49e973c3b2a458b327f2c76adddd81cc0ffae74502890666c48f3f337a7198a53fbfb8acb09829b1ee01eb5876966a9dab6e8840fcaca1b9f437fe880f7f3672f1858e4d02ef2146e73972bdb349ec30d53cbff6f72cd1e5f3a132952081fd31c8b3a35280f22d7f7f384ca14fdca19761167470680c4f2e2a9b736239247ab226ba64fad1235ef8dd21812123aa11b7bb977230164a6fda2693a9c4e1b7908adafc2b791a02a7de66dc670c3aa209c2f10ec72dc5f0b315c5644d016fcdf517cbeebe6b45aca7907bfa10f8a883ea8d3e76d9bbcdb5ca646d0a450957ffafe9d8a1c41a3a7b49629614cba469a31d9532479df6f27dad4503b2244faf71e54c41f6f583b60193dc02a1669832d7a2a2930c520c2bf27bb557fff5b99f780dfc064f9a1bd8cc268b2e3bfc157f6e6d160657296cb125270e6c4be6827957ff4bb6d6c6befd2e4d51742ca93493f705c6e735bb82ccd14b7f052fbbeda08f42dd0528372e21370e6f79470d172495633f62589f709ee39546877f577ff4cc2979a9c7b5293063f8d02e0badab3582d361b519d08b2b2828b636ad6db3e0b78d1b55cdfe7a5c9ed9780e0cc36efacfc67c8fc411e0c8962e03c74248afa3843ad27fd2e35bf3d2dca88c289b0d31c8b5cc65bd8895e7e3e82f1d1d2e2adb0dadb8b2aa66d8cc5df049a699ca4e0a67547185bcec11ef9e1a9c9e3f648c4e914f96f405e0735bd61cd3ff4396ef4cf85283f15ad596d05008f9c91c83df668ad5f98718e6f87aa3b85055564c34c977275d6d916bad63b79bfcf7072762633f51291a0783876156962fa80f1092539200adafb1b656519860fde54f3cf8776badebbef96ab3677e1e46bc188c8e8444d63bd96013fa9c74f860819ee83edf73549c0856d5a555193be41592a5cf9c31922cf479e3c6bfcf911e7a732d14b16b1498b309b0e345695461d600d117252c7bd92292e2f632d645b7b28a57fad611c165694db8a55d4ccdb3e40d20ba3a9ea53eb5e6923797a70fdd577fbec9b07205e5185a042c12271693d706c10ddd42790c80ff3cae75066d33758e990e5ea0d0f2d4293ac2e535d55ea1b23110c3df8f2718c0956ece4587ef791deaa14016f214a9e5ac77dc0cc2f2851aadd505ee27d68b77355cf5149b042a582c549edc2293e18e9c80e0ed2f0cd1b4a7156d787f0dd028342da78922d655d5ba29aacf86f9505bfe8b1c13ae0723c6d43c50f5a051149a726c15de51babc4b9d409d8f1b83bd8ed0f48868c8aae7bbe7e207a77386f954fe742fee79d44767ae6b264418fc2928251777c01d5824adca7a6ad396b8c498119214a6359dd019373ca0010a341ac1d8c8885a60013ca68d04889b17f62a942d80ae5d17504c0dac298177a4f5447a11ee199e508959f5172f6e32d842904b064960003b7851c4e1b635b4894a772cb5a7e41e541089001f1840a8ccf08eca6088edf0fd961ae9bf2b756a4f10a1e2e548f8d8580caaad7da23636f28acd63e73fa10ee354582352260d3ec93951e538a4f7459cc3e57dd3e53f11345a548bcf545f18a0c721deca3fdc066dbcc10f364e2fab7ed238d33bcb54d9c91129ce3b87ed5ffdc57ec2a1346d4a57a34c4f3217aa3d0baa4943fc78161b06a9e3c84d4fec8d1338683dcd41f58b93237c28d1720644f4bbcc7fea7e0d5cc9252ef08bf5dcf95b599ebb9593ac998992c1dae40c660e86653782cba08c17ddc57d66be5b67635f6bedc3c7746e4bfed41079480994e0271b1316afa1cc7f2731ff5620fcc2d8d8928d70b39724948f4dd725f7c3470bf2b31e4fc517ec5e600ee5bbb301457f76d06be00fa182ba919ced2687fc305226459c31010d59e587f689738c6f9ed5390672a466927112765c86a89a63dec5a92f8c8b8e3e3f1f9364cb718251c49c53281c9660a60a978546c10bde0f94a9b9e3fdc9741fac28419f27cebf2e1b50ac43'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '305a19dba663d325d4a52bed2bb1251e',
|
|
33
|
-
content: 'a9bbad7d2d9203e0f848b41213ab80f122330688a63ae1539a912d1672543bddeb14ec9642991aee4a1a0e245e7628da5d783ddaba3091748f585bdb2c9443c5dae4d90a5ddfc171e8014077cca182de788c0cd607960912b2e24aa787b40eefecf14cbb47599818d92fd1fdfee25c372a400bad00691476ebfe735264894aed8c853a7ac691e25317d13eec575458680ae8ff0335acb84b9d5e59266a6b08e23df4a4502df9d5e160e107bb4d41733eec700b4f1511e70a815b63c692db172952655abab192ec43102e96f889ead667f481a4b7ecb4284ff6f3d3584d8961690b44ade74037f4d8adab40629360979da19afea9399e43aa9c8a336c12aebeb18b50534749d7ededab87f05dd8aa225671e9064454bd8c2ce6c576561ae7f7cd299d4a1fde02fa04c0f6de62b335d2a49716c2869060bbc7b39656339758efd9f55e7a934df0af99ff6a54913a861689b03ed7d5fc4b20e3e491da304823160e4c55629642f6a5c345b6303cbcbe0f46f31680c0391a29b1ed8489e5fe028b971c3bfa0c0469c8aab6aa14cebbe4be035909421655d347011ddf98970ca05d623cae80c452795e3a8caccf64627b34391d4f4cd96fd34fc891e0a3d9d4f45a5d746c2e854e8786ee835d6edabd434a0d24412c2a0b5cfcd4e40b6261314f8db60e58794111abf1bdf363b23578ea4850693101a24757a8d3199ca894b58c7b495824952d1d4e52c2be7f9a860369e8426125fbe13ac452db470533ba3f1f8627cfd4ec07540b3f3c16afa1a2731deac99a2e9bfd812b23a99b28807ab288ddc9f6a9eef06925e424f397b5f51441b16960885f8897ac1c4d1519393c95c1bb8a3e6eaf3f35f1ee542c6e9b4d54a5e3a0e65cc7581a218cd0a9aa8f9c1ba52a4c44d8e826f79c0b70612f84e96dc4f1d0baaf7367b5f46cff57cdce2b025a82a48fc9296233b3b458115dab0491ed6cea7c52c0fdc52fd422df1c4cbbfb12a1722600741d6c74bc90f972e2f412ee916e8fe0732acb933b22e9b91bf28134fa53dadff443830dbdce517fe478c0d7d6f44ebe212006f3bcbd83ac936fbb1eba4f3585d7db5c5fa93cbcde3682f2a4ddb9ad03c5adbf223aa5f157ae6658081f361e82ac4a671bb840be4088e53bcedf093c2433c7b255bc9181909fa152a9d154d1d31cc9f00dd8440472b51c3966036c9ebb93ac9fbf5eaa624c989f8b20cffd727788a6dd4f4b4701f4b93cacfe4ea7b8241214ba40865c350b8c469d2e8e8d1c274e22f86586c3397bd26bf8b5517c105b87d2abd18a226ae5753f0459b57c49ad45bd331e5e61ed734dea580711edd1de8cdb4e11f6089b077f1519b29d8107094362192c68f81cc1ddbd50384fefa5239ef3a3c5d4270e7397281af8e2bd24fa38f75dc793e80dafc2c080426fc2c1622e14a7b60c53103b10889de80a887e491095e50620c20f2fb5be9e114dd9cf37f7a571e6db619cabbc75281f2f89faa5a837af165d3fe0130dd2d25ea6a14321a03f251bdaeffb8d7df498f18c059e6bd6673e25cd12d066e2acdb302f1761856695dc2d1dff7fd69d5a23a43bf98ab371dc151595820c3b53d0f8d26660e45de920a424b0b7401b759ca6e6ea28bb6603635c43f0410abc4dee7b9a6c7f4fc08ae0d019233838abc30d00c76bf6ebf1b109077301a98c0753d5cab189a6fcc1f4139a06e851c00ca4e75c0b06504031b8a2a28a01cc627ffecb86590f5f6c8049178606f92f3d67b6dff10e22c3c03d9e45d39c134de55147678a42a3e243f8193fe4e4d974af2ee594efd8a9e1f07350d418ba459a16184a3e7531674d89dd9bfd39d6f6084f2ae64f6b8b356f3d1ed2893fa10835b28e04425d4df2e1d4c4b306ea57315c0a825a65f8d85458723397c660463af315005548564887f5ad09d02f13fbff08a0a1e3228bd906b39d1d0f9c9ffa8c4deb2748b51d62779653b7997195cb54767514237967af63d2d583b3d05b5d41da341b99409495838b9bec91a2611ab7fd3d6328472e4e7d3c9253fdf8b47d4a604048b16c78c6cdb32e182d619df0806aac0c605aa6e0c290544ef9763f83ab8fd9c6d3fb77d621bb26f087d38b2fb6e3b0822925b0ea22defaa2a86365adf89d65182ff4afcba03d12b71ffcb36bf02b7e6614f2022e069754878ad42430d30b1f4a8ac7b16d4255d9426b9197058298e2255351783fb656cad35171a7a7d388d60a592fba5a35e51c1e58befb81df51b076659082add4eab83a742cab64ed1be4a0b5fbf453b5fb41a14fd59254c47b080e5e66111e1296f8adb77c09f628647673e83f29365bde2a12613418ba97aeab27c7aa1f2df97c9b75cf9a2ac4c281ac52e62674b81f618522fa9d82b8f7f0111c9e475386df6f77bfc58c6330bcd921a4c84bdd2f0aec55b4414e18954c63a1e48e81ca7e174355a333e865043a97b868923320c5f342604e09effe0d7a1486ca20537292ec3b768197ece6e37a63a61269a592e270157449634dc4d023858c65d5332acab888755f2a18df86f003325b35f170e90d52651da5e4181f8ff33b82be0c3651ff6eaba9316a9b45bdd7de3f3464456806c7a6d80d7289cf4daf93e0b06d27b22d5265a84fc35c4c294c24655b1048ff88617829e5a3c3f4a93fc48302dc5caea6b3bec934da322359d8d1eacb0b4d8039870e55caa987440e87466e04e991d7d2d3310e76187652804c1371fb655352abe4f19231e3055d664bdd894991e11ffc8e9c7a5b35d4aa51a35552ec84c8817edc1ce0e14cbcd1837acbbe6c606ecc759901e9f6257665cb7a3b2c9335929a9664a549f2197a7248c8a373ef9f106cfeb4ac866ea99ce2174d68548413674b14237eefce8307f3d71f94f36b65489716850bbdac0ca8c0c448b3e60f9ff635c32b92591f0907af20c9f01501b612ef0f3cfdb315aa153adb768b2747621598ac6e8ae47d98b22242e2e0f5e2ce943de91c5d3c00c5a26eb65398bd0f673aea54075d3d587e660e16020442d68a7293f78291af7bc3c7fc8509414a24ea1da657c3c376fd0e712bf203733f3212d1de504e1937a88852ec8e6da7699f0b0f497c31493dec75bdbe8a4c67d38f1f129db24a0516dbf6c6bc99e6c639afacb8c81e7f171de28465ddbd523d7483a4db90c24064120695a03cf5a41619d7571e2aae89d8ee6eabafe08cd072980353143b7628f6beaacc914f05f4f01ffb0c3760a93c933dfb972820a902e944f643fedf0f361080de26e977e323ac0a281735a396d91e79f8d979fa162dc5cb64e52e3172361dba7952016039206606c538b510d7c7d1a6fefe048a84b1f8b28a05dbe5e985066802a8768baf62ccb2713a0eb7849c587d9a3d73032b29a251a2443a257c9da988b0296c6ff4e6a0cdb2abb80edcb0a185a6ad40b37c646341431cc33ff01b36a4e03203a241f06d3bc07abe6a62e5d5254e5bff4e4388feab9a81b4cfbc71b7a36a296a502e615e7b2dd89ed4a7344526749afa3a2e929b5c6886e912dd5ddbd07747755760fe9148e8d2c00ffcebf3fffdfd9f0dc504b31e8ea050fb763e3b26c08eafdcb8329b00803e8e84a67aa578219ac08da4f7b95e71eb462f81f5f4b3a896b1c8d5123be76110387bfef807b8b7d6fea95a4935d455f3c1ce551109bac3523dc900acacf093db63e0a2349c6f11542dd815c09938fdfa3d1a64398be79219506be18c03bd076aa43f50cbb5ebaae1e552c30575e7f5836b56fe6fa0fee96e2148fe4a936a53b5d4b44bce7ad2944c0b89fcce44da3723b6301cc6229f18d2d42e13217a0dfadd67494ead833b184ac871846b2722ef94c2759422366c8e221e3cd113bf1345ec4714337c510d59fb4c76869eb2e5def68a765331fa35a7741d25c5fe04a40176458582196b2d8831ef5113e215095f755a0be90d47e10ef192d9203a861ae4ad0f36da4e2dc76d7cbaa048e950d6db23843a883f86cea17e592a4493b66bb257d50ab6b1b535a23a6bdaa246c2b8b2d00222fe9d56d6bd19890b869b91c2ed91dbc02e5d22f4596ad85b3282fc1060889c35c30475e58886ad94647e8de5d72daf57cbd198fc5ec5b0eab67d7d7f8b4df20be6942fb284f877eec2be39396b167786bf852f73688c9f0c1da63768bd5e22149a0c0a456f27c05b590ae06e82ec9a99f6de3b315896f5f4e712e1faf03784104bdefe2fdbd2d9b341ec9fb057797f028c6d8f22f723eeb207c7329e4e97fe22c4bab69f16217d05af903580653052aebe9a6db219af754b11d3364cca12f050dd9383b10cf12e2ac1c08370f8bd0db35e09634664742eee71ec0053094c007222067e3a7f2dea7db7c02dda0f3be7f3ac03c611dcb8dcfa3f84f61a2f27999d2afe0653e65bd6e53e223e3bc8efc855e8b8f70998d6a712d5f65814318bee11873bfd8a362193f66aa402cc7db806735f6907384f586f1dcca3b2739b2c93f50a3460f85989c02592935457c9aedcd72ac808c4efc893116389e47558d86f90ad8caa541f74f5b8108efd5349e4b9f04a7beb98e4bed7edd81cc3605561987d6c5d731268c88617425411ae8f94ab76eda8487a2bd15f9f68116de44589bf020aef9b542172db114570b7441c521cb45c94c2ed72bf8e80696bcf40f74be1ef01308d95c98f9d6b3a61c8b53df7d9727551370cc53d521e6c48ac950b05f666e9d73cca86e371dd50c47f2d1f78b53c9795e1f1c559ff06270e83c81c9225bb01bada08e71cd49022d188c9e0b83dda4f163fc0549814225f4c3fb297477677d666697f8e274bfe3390e4939bc909fe8a7e'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'd6c491906073eb4a538242a9a966a62b',
|
|
33
|
-
content: '6bdf562c3ade6c0102339f0e6e138b8be5d46e45602c4315834dfc18f7a3cbdc9d20e566089d816ba552c34803044923e0821b3957dfd4b84c91931e2051f44fd9f8578c9554bed3fc11d536c80cc13fa7a43b03a6169f388dd60918d0fc05cbcbdb357d46b810f115cfc87e9490b026df2be6cc88d47c376b22c18044fa32e0446bda4e2932ede5d3ddd5ce4776fb52d9082aa03be3a2730dd40362e48320e590ef6138c6797845cfbe78f1f64a8920c7940420b59a11fdfa935e9ef935c501c3216d822ba965550a4e43d5da3bf46ae3126f2c4a9a15de36e5edf63150a5164a479ea4b8f011105ff460df243fc8ef249c0a82b18b0072f1d72a964cea2ccc666034f7407864a9eff722c2dde91b3a3f618de021205f0b797f83f65e0803673a64cfaf98623a2dbec92b647a8bcb5def902934cfd66d3ec926912a6250f94f8ce38b24ce6bd3e7d83d52cb2ce8201883c29cdc290f13d42aa2f6d05cc05163caef4520ce83857ab513fd8bf8377d304f87a8e11703d237aaa0ff15adf5d868c9d57f0037a2d7810574993871fc01bf8ca807ee0c0fa77c7453150adf2ba1515f453a45b2af0b3ba712a5a28862aa5e298a6fe5c05593c37758a0de2ddf368c2bfcb67d20785879cea3d746668f4283bdc720f2fe86853afc6aaca763c183a26006207ed4ed78dbe8b11b6a8ac1cc605b23594c7d6f846256ea842c7075a1069af8a5bb829f1b8905ba7d94993251c7fd6f8eb6b35390781964a3a49643ccb78aeba8eb90f06bbdfdb1f23d54ae4766a421717dfb5da2a9de642fa70d968c88812b3dd3fdbecea6b06d06a255dd26e519376b6c583c84179d05747c11f79767f4799de73c8d65c2ea19a1609df424eced096e8fdce2d97d6571db47d33983026249a5cffc593959c3a5a4bf826b418e9801a20d1be8a63f11613520ed2fffd239c4fbc3609f78feaca1599ef5d206bd49f767c7a6956d1791a460605d3daf00658668987659731cad78da8f3b67f225d0be19fb1130dc7ce53a85c1839839a9975d6e2b85e9fcb966e82dd7fd4550968ad1f46c134a609399b27e1e8a2a25a760030b0da76d8fe950509271089f07e24f6ae905c9256e388550848bd1404740a000386630218d5cf3d0ed68bc109b35afe26946cfe6d80ca3092e6f3d0846997ed39e2a005a92ad9afe25bfabf2e0b50673166ef51b3a295c706ebd92e058e63694bbb257f0b37fc90c1a94ced16fef22a76783f34346584418bbfdb22ecb1d633d6d196d26321bb09b28aa1ac9936194cf663b8077c4bda7bcf7ed8f3df4594f0ac945dce6b1a53c8f0cb5f9d0d5e50234b1d8a4cb0912bc234e018c6b494d83859f908b9745758bd98c9a214d030ab208fe09dc13a4e2214be90a59bdfbb2d0e4642ca91c02482fb19031d9f64f484ddb12e32bf3f1906640a518f7a781a6677954d655620e4e53c238209cf3d34ef17f9488fa1a6d0a12fa569bcb9556c4f14cab89312752eca829983d89cf6dbdd3290eadefc5f078e7af4f3a34a80d8f586a6232e4bbc2a3557519a5acbae97ed82cb992bc360ff6ec7c3239291c723ae01cecf344326b0533ff12bd13c60a9e2cc90430de1c2b9fc5c6b0d39e9338c28c188aea7204bfdb2d51d6acbc8486bc62877d6d97970134de86f1364f533bc28cb654fcab8fd7dab78f7ed49cbb40d72f4de70c16d4367084ec55bc48a5d28c2e1248ff44a4211cb90035949920cab49567f8df20de5b9f09de8614aa782a67dc12d6be656bee59af93360a402ae98168cac484db9788459631a7d43d44850a39ee1c142bd720960c12b9c097c6fe3c0c31ac95b823192c182140458e87807df0162c9e285f25709eb58163f484697650bf5c61ac991f40786dc5e3d14f75ce907b89b75dd2c12438a4f4cf4c9c10eeaf7552bbf7efdfc1b5140015d16f425bdb66d6b6bfaf5b571bd6b7ad6ff926a2c75349f815f73b8ab6cb40b48fc3c9cb8548ad31713f9632691111a5680ed15ead2fe23060d0528c0087e214f982f6d5d45c6f5209837872ce7459866d51a06dddf41c85bf8fadc528f25c4a0c45d9f6efd5d1b7cbdf21680faf6b741033d98cb4a4bb6f857811579632894ca039f6b6c6b268340595a50da394efa0c6e739f2d6d7f3207f2502383eae03e8600c643ad762fa41f2932a0b3efe1587411b40d6791a113c6d5dd2200762fe778daeb507f8d01871ccaeb75636ed2768120a6b9374ca26c47ed1ee62c70246bf204157b59823ec3054625c6ecb574a0379893710783fc7df42b391690e75f6f322bc1c4cf49db20555a639c6df67704126bbeac9623402f3e500bc5278067ccf60c88f3e27914c4f42181b5c00e22f9356cbd7cd2457c6d9157d2edc44ddee9b03c52cffa77862aed4380ded7661a082af2db5d4414cf25a0f9a27874a7020cef0139d587f87def2d4a90371029c98bc0adffac7898325e07b815e457f0b8f180099434dfa87610902095aa1e7fa853d8008fcd62df6ac5c0e1d303f79174a6085639b423239a689964d8521c81de9158d180c7c07935b3db08865beb7abd5cf6b2535433efd53b53546670492fd9f967da186f3dfa13a99e9fa5b4a5ed88671e82025dbe7daed88c848522b0f2cc267e1534e0094891559d288709159c52541b4d0711439ab9683ddc30a6757463ea95a51969c4a3de5f5f39d21c6ffc566a4a2385436219f8a34ebf1f7a0b69e53cd8c018e6be035864baff1ad6025083553cad10f81ba4aaf9500d360c9d8aceee5b659fcd96d1248f4cc65b8a00bdf6e3240a1d735b202898b76e23f654c5e5f86df16be2a7d3d2949373b3e70d299d66995c5a20ca6f87df506201e25b70c9a714177f525aa1587ccbdb56f6861a4af367eae935376da53f1a74ff9fec1ffd0494fc6e7727d7a3c50b3619499e9548efff960d0c2c70ab7d1ce242b311a9ca23a21c6978cec8c0b3b37c895e33a97fbe24c2c81dfb19b4e9324520bfab4543aae04e3d337f7a6dfa28d49a9bf94de337babf8d51a7986e6d36e43bb2b35ec1e6bba7e5da5c70f0bc5b81f33db6703dde124bd09676ad036597a202ef43fe26844b4c1a4bacc7f8e2643d71726b5f249b9d646429a2e34de03ef5d5136acd371a564c4d8c523fd11d707c62dd2b9c4c4a7ee3c2093b101480057b7c4618ef676d63131a11b50377bd1817e16b652aa3960febb26585debf23af6c07910b1cc3d25769b1c282c099e6a444a75a67d11e9c930e7872fef05f89708839f72c0d0bd4d3a280da331b45118c0bd242a87b5058f5c0319bb47de8ed260f8c3210c9b9917893b3ffefd083fbd03a047aabd5f0bb47d266fd8ee9a1ae8135816adcae61c5febf9ad5b2d5ae57496932a8f32bb9dd8aa6dcc81f1f70c0f694204758d604829515bfc1f55e966ef2978cfd29dec82889c1d63047a02d73ea5dadc75a309563fc290acd00d2abe28ec85cb4e5f7c88398359dc67545db93e5fe53d73f00a688f5136dccc67e87a81f2ef97259c74c77918006851ceae0409e982fb546783a3dd3898561c5c8de295008a9200ea47a4c71de5a76a4d2b80a002e3955577c836b9f9bce021e363ba687808cc036f2f9bb58609c0307729b7ca15d544a52752cec325b5ab2387c3997d8ab408d524b5c54d6d0cebef3d726260757a26a55b0dcc24d2fed13ee5106934ac29fa04c9fe5584d6c13bc54716bdd1a50ab09d74cada334d3f51703826c9b273f6e2abf387ea82d39a051cbadce6b1664b5d4bfe5fd0317a39ce8051347cc400422c20c9b08548ce8eed968ba67f134f8e2db67862072745347af5a60bd31a8ee516318895c261493406cf54ae0d3b5e27ffb1073d3cae0f5c3823ae28e89edb7456c464efc55f547fd7bcf6abde16ab61e2b3f06673bd9eac40b8a426a29f3ceb065f9d9319b33c6ca90515d60b3967fa62e2ff1c846f808521e60e0259556145b8a0634cb3be7a96c55876e1637fba8082b18ebc6cc85947d68a3e9632ac08f623e00b0af70051bca5268f61266f74397557abbd043a043831f12658b2b94b08d6ca0a8ffbfc026fd0f7cae3df719a2a036913c62831b8e785989ae6cd4c10b19e1ffcbbc01143ad7cbbeb3ce87e412940fc3636db15f9c652a75be539e7005e01e8ed0bef40f3dcb65d603021379c3b70453f5e7e9fc4186141e5fe916d64a33a8adaf733fe6626002d5771d2e3867a16ae309a6d2e7f8fb421354d1e0e5b8707d5e08c68d48a10a0143374c4b188e21607e380074750b281962cfc5435a88560c09adfffdbdfba51697e6976a30abfbefc6a04d35e6b0f333ad2e5b578dfb8f274a6d611403e73b505707f0f48272b692c1282e5d4599559db84bd099dfb2dbfd13556ed60ed2ac1ecc7f280650b4e8ea31d20c30adb4752cb85c6b10e8aaa4cb1fa2d7c9ca36730d22da0731be351cb9b5fe2ef10d778213e1ec1c9ef3343ac37cfbde2976248bc665c4c6efe8b75ec136ef6b4097a9eb19d53da875cf0f8afd660a675a47eba37d82e621852cd71d1e774ebb26f26a3cd9a654ab5415f0e83921cfb41d3b95c256efa8948979e19f1f4271eb8119263fd58d001f5b1b5b75a496dd8b71350a38c6615ee78369b5043e9bb960535940230cad430648cf524e9c1d234f87bacda90d46770b7632008029b6af3e56e38db9fcba1f2fec9b70301113f01ee03a04bbde88b59a3badce1520cb2ae26edd29198482739239ecf0b205c28ddf7eb4c81e0379aebdbc7f6ecfb5506465eea8986baf2ad742a81be5d4c4281c81c33853fac3ef7c792734c67a59b1a90eb5155368113f673862e558ffcdcb7f98b46b9bc4663b4db9d7815716f8056274ee494f0d2a51e487fcdb72ea0a4a353a4fb094bab7c69e62062abed451f9ad7dec9749c93d4bfe0ebbaa2579299ee7851c357cb7e16372082058251efbff8998dfd87d8fd9fda58be15d64b13036962759001615b3ed002f98b7405721db1086a09b61082fa46bd5fd1440f51a7c9403e583488da90d1ddebbec7b79e8fa3b966358fdd5e56'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'e27e34b98a90543da353a14fc75f2e1f',
|
|
33
|
-
content: 'f478d7c49ea6ef6069d2dc500ebf486df6e2109cf88ae942c68765aa06c1c9f73a488451ebf64ad41cfe7912b872d598bea2c52ac53c6b1868b7bd4ccbfdc9f5080ca9c8db58388c2a4ae7eef9e0724832c4ece1576ac8b7df4545f494beaee0c047cebb31305657b1f53cda09b2d5f16214dffb511175e241f8c0e4ef7ae2b704c5715c1e3da1c6689b8483579d529b3e04ecfa9a8a928b0e2fd33c2eb50a343c0bd0cd025e39db933f94e210df9bec8656e27b69067d589dfa74197e13b5299aa93a530c37725b9a7e65819934709936ce7e6a7024b7259d9411139a5f87312615f3698db9c4969369eb67ae73121cdda9e2bd64bb14ae329c4795c2c79ef804a8fec11728da7157a55aa084587b3688b2a2814662f301f0ad0ed2f87c7dd95b7559099851797293f0e71db8e0c698261e5fa1532dc453f4d1ccde654adc303cb91807c99940db2700b4c9f001c1e83afc1c386c077c2e3020c83f402bbdd04f38c702697f568d9aa5c5eba5c1dc0e349f5fa33b74dd678fa0a83c9683da57b4cd394d4b2bd564c3ea04d63e7f3c309bc955b48a0797597de72536239a74895c129e54a15c10f5dc515729c82a6b78d1f44aa0ff07e1dec30759dc6b408689176496dd7b7b2b6139b9d52c3099179a05ee874e68ddfe18a4d5ab890b7da35572a198bad9d8b0db3212d02fa4f911871b16de521e47f95258cfffdb433dc22d01bf552de65bf0b990d7dda611dc1b65eb11d4790aad57df89d1f66e14665e5dd644d52a499179b12d10380828eebf6e881b20f5dc425f6bc2b0075c7221dce106f1d4507146a520c5491a5932967bcfa1eb813590e7b47a54bdaeb218a0af449e9357523a7f9ad5fa3e48b69dae8cec58cebf54ff2eaa692b0c81bc2c1e86a5d65e44ab83ebd7bfd5ce22fe3655ddb5b8ee6cb3ca41f11a2c2fc0a6cda38054dfc256c458b8edf5592f8be3a42965b270ed74964f30568245323b32b5e86ccdb6257db3eed103a253c896bc5f917f3000fe24f3c66722c47498b6fc5023ab5086662edffc04b4de06a39425734300d736db3d8bb369bd645b4a8b3a9d84aefe8252b8b2e26aab64769a8a9eeb4468dc5cae3dafbefb22a266bd150573dfec8909fe81b9f25b08050354e0b2d8e0e007584710990217faf8b9d0b46b935c3addf3eac947f389c4b6c1b42f5c3150922b95a4b20273abb035f0c17b45d320a13ccc80d5974b35e69037325b5f0dce3a99372fab9b5e75459f517d82cde5e0e4ceefe5953a1a5d8ab57f8cf8df61c27469d2639fa558ba91a9fb7955db88183a4c5ed70200bad2c5413c6387b7f9ecd94ee7a7f2707be590896129e1688483c4852bf5be50aa6a8f772b18b6decbf747cca3cf70888784b53d1ded7be05c821102b2b4d34cb4415343095c285c91b1a46ff7a52dfcbb4da5990029823a44aa39f2af156dd714ecfb3012f41f7fa510e646863eba124d9b175d4b71c5075a14298dff257a3283492199eecc97628886e7f502862ea2b489dea0fb935dc515224e14c229ed4607b078d24abfa57d88e76b67f6b72f8e2586291faf25baec0bb3d19e893e8e69b58d68b9468039be614322ad109ac93d1e91244a7a3003d1a3544ed55b630cafb2419bf584e425a1c60e7b55b3aa5cf33f70a370440c7ecd1535fcf6f8e314c84e4dad7c11cd9f6d5ed10aa3cfb26cf5befd6e8d71333c1a0fc20bbe9e0797b9fece833a39008a5d54c778a617d227577bb78e9c2e0bf211096f139ae2cd30fc30151dbe13839e141a273e03b3eee507fa51422a1aec54ea52d6a65c62f18f42af27db46d75d3d234b53e76f0bdb23025fef20fa59f1d8be27b0c62a4bb0b8dea64d56e23d544052ecbd4d432713905d14eff4e9039e053e848f8ffec59b370d546b8d3548fa20e34c0ed18e6ac86ebe641e480b23b38bb58e4fc9840724c08a432c651614f149d269ee48f77ba550174b62590bf55617248736728c73cb4c33426c083b693413d3bd275f781ddc453822068ff7c159ff131dde2c61394b0356de2e1733e152798974fb3f5cc1451fadf5fe0ab247820276e7338e0e06513329688b8495f6d729b697147437608bc3321cbd84a1bd85d09523e11383cb93ab0828ba0d3e07e03a7fdc4a050a1ba6135f8ed969477d1b9fd245b8146fbefd30be0879ea9a7fca1838a2d4fbcd959178c57de9d5d5a8e41ac8392f17f115a733b9bac31a16e193c8412d795e52bb45ebc0d043c8e8bc72c7d1c1a1bea0a3c8fe4a235b23341eafbc0b1a5685e7d0f061dc7ecfce70ff870bcf3322360806d35b15c19df2001b1b827944295f92f6004481e954a60c3833c349fd38028dc82ca6bf47252bd41922495067992457380920cee1fc2c4cd351c3a9db608e37780a2698b15c748443f63495db84992fe519700bb1620a075a85a2b4ee4d13a6aa6f67927f16b3354a4271142714a82cc7672fde3cc38645a84471f9871a6fd4436306097233154511e45430f248cae286d8e03f6a7141e81150134776f9970f875bfd8225ad779099a680983852d43c743a991ce3da0746c93920c2ac68309bfdb826efc43cb86573972ad34274fdf9d84f9ef7fc142550143fa5e34fcfd215cd96f269c30c694ce7c523e0e761979517de4440480db65472d08992f0256da0cf346710b241fe4f81aad8d977bc805b12c2586c60d35fbf6c812115891f604f47802bd4efa88317a0ba916843c9a176ceefa0e59f83e6ef49ea82426c19d4262c0ab08654cebf9c37474b17d17f28a01407cf94d8b59b5c18e5ec07b2c72453a8c960a7ca816513b45e819c10e172a1bc6cf203e9dc945f1c17307a7fa9ca48b804f21c061406a93040d4b09210f3ae28359172a0746abe7bd7db0c68a37739480482b4a143703bbc8123e32c4391f863d5911d5b44b370385b1dfb7f492d20b141d08ffc7e8635152b3f08e4f7816cd34e0924fd05fe8710674e606fa304463ed0fab79e755c7ef9233f50c1d5ed5347d6f0a48ce703bd4973268b9adc120ebf4e3a173df47a57e3338512babd88b35e69aae9f311df1169df5965ae9f93fd68b0cc3e1a1077f11cb5bb729f62d0d5429410b9593d8601113f5eb2b4b84171311e320cb353e589c8651b4ba2d06a1f7ccdb380cc8124b4dbf5b697b8b87a3d30aed6eada4a41aab911eb423e08b61359b61f0fefcb05515bb717479537507287106fd3177c27393b6d109157b3ba4ad21d26410d0b6761506453ed357ae745a7cafbd96864454132cd01d56aa8107d7736390e499a748fd2b2232e633d1a90d942eaf329f42d0b84c61a209e3ace8c013c578bca0245fd1889c0017f5c5b963b392e12c0ab76561868e056b3887a9282efdc943b2f0bdda2b84d6ffe0bf8ff33f485a51e3230ea7f75516426902d952018fe8c143d3dc29f362720ce6083999460f3ac7aae6667a2730fe6f01e6338abf7f73cb2f110012649ea5d947b3065aaeedf43e2884eb9f8bfeec4d793b268a684506e75ba4964d3cd581c830569b0'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|