From mboxrd@z Thu Jan 1 00:00:00 1970 From: jon To: development@lists.ipfire.org Subject: Re: Proof of concept: Bridge rewrite of unbound-dhcp-leases-bridge Date: Tue, 19 Dec 2023 16:34:15 -0600 Message-ID: <03F3DF58-4729-495B-AEF3-F8E7D63BF439@ipfire.org> In-Reply-To: <9A45BED8-7F88-417C-99CF-78C52204DA1D@ipfire.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0431757945420925675==" List-Id: --===============0431757945420925675== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Michael & All, Here is another update for the `unbound-dhcp-leases-bridge` code. I believe I have copied all the processes done in `unbound-dhcp-leases-bridge= `, so if I am missing a function please speak up. Everything seems to be working A-OK (for me!). =20 - I=E2=80=99ve re-written much/most of the code,=20 - added bash functions for unbound writes & deletes to get rid of duplicate c= ode,=20 - and added some error (invalid) checks. Since the code is not parsing the dhcp-leases I believe it _may_ be fast enou= gh for lots of dhcp clients. But I have no way of knowing without your help! I=E2=80=99ve written two "compare" scripts: 1) if you want to compare the old with new. This requires some updates to th= e script below. 2) or if want to compare `/etc/unbound/dhcp-leases.conf` plus `/etc/unbound/h= osts.conf` to the unbound cache `unbound-control list_local_data`. Static Hosts =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94=E2=80=94 > =E2=80=A2 Static hosts still need to be parsed into unbound hosts.conf file I am looking for help with this since I dont fully understand the "read_stati= c_hosts" section: https://github.com/ipfire/ipfire-2.x/blob/master/config/unbound/unbound-dhcp-= leases-bridge#L183-L223 - Why are the static hosts read into the "unbound-dhcp-leases-bridge" program= ? =20 - Does this section write the static hosts into the the unbound `/etc/unbound= /hosts.conf` file? (I dont believe it does) =20 - Or are the static hosts for reference only? Currently I do a quick grep search of the `/etc/unbound/hosts.conf` file for = IP address and hostname in Line 142.=20 If an IP/hostname exists in the static hosts file, then I exit. So I think this is what the unbound-dhcp-leases-bridge does=E2=80=A6 Hostnames with Spaces =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80= =94=E2=80=94=E2=80=94=E2=80=94=E2=80=94 > =E2=80=A2 Properly handle hostnames with spaces I remove the spaces in the hostname=20 - yes, I have one device with this non-legit hostname Is this OK? =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D NOTE: Do not place this into a Production environment - only for Test environ= ment. =E2=80=A2 If placed into Test environment this current script will terminate = "unbound-dhcp-leases-bridge". =E2=80=A2 Do not run the `dhcpEvent.sh` script and "unbound-dhcp-leases-bridg= e" in parallel. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D Once again I am looking for help, feedback, thoughts and comments! Jon > On Dec 8, 2023, at 10:26 AM, jon wrote: >=20 > The first script did not place A & PTR records into the unbound cache and t= his version does! >=20 > Once again I am looking for your feedback, thoughts and comments! >=20 >=20 > Jon >=20 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D >=20 > NOTE: Do not place this into a Production environment - only for Test envir= onment. >=20 >=20 > Description of Proof of Concept > =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80= =94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94= =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94 >=20 > Transfers DHCP lease information to unbound DNS >=20 > =E2=80=A2 Enable DHCP On Commit/Release/Expire via dhcpd.conf (or dhcpd.con= f.local) > =E2=80=A2 A new (or changed or removed) dynamic/fixed lease causes Script t= o run > =E2=80=A2 Script adds A & PTR records on Commit: > =E2=80=A2 to unbound dhcp-leases.conf file > =E2=80=A2 to unbound cache via "unbound-control load-data" > =E2=80=A2 Script removes A & PTR records on Release or Expiry of lease >=20 >=20 > The Script > =E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2=80=94=E2= =80=94=E2=80=94=E2=80=94 >=20 > =E2=80=A2 Handles dynamic and fixed leases > =E2=80=A2 Static hosts checked for duplicates > =E2=80=A2 Re-enabled unbound-control local_data > =E2=80=A2 unbound reloads not needed > =E2=80=A2 A & PTR records survive IPFire reboot, unbound restart > =E2=80=A2 no delays from difficult dhcp-leases parsing >=20 > Not completed (yet): > =E2=80=A2 Static hosts still need to be parsed into unbound hosts.conf file > =E2=80=A2 Properly handle hostnames with spaces > =E2=80=A2 non-legit need to change to dashes or be removed (or completel= y dropped) > =E2=80=A2 to be checked with large amount of clients > =E2=80=A2 I=E2=80=99ve tested with 6 devices on test system and ~40 devi= ces on production >=20 >=20 > >=20 >=20 >=20 > NOTE: Do not place this into a Production environment. Only for Test envir= onment. >=20 > =E2=80=A2 If placed into Test environment this current script will terminat= e "unbound-dhcp-leases-bridge". > =E2=80=A2 Do not run the `dhcpEvent.sh` script and "unbound-dhcp-leases-bri= dge" in parallel. >=20 >=20 --===============0431757945420925675== Content-Type: text/plain Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dhcpEvent_v25.sh.txt" MIME-Version: 1.0 IyEvYmluL2Jhc2gKCiMJREhDUCBjb21taXQvcmVsZWFzZS9leHBpcnkgc3RhdHVzIGRyaXZlcyB0 aGlzIHByb2Nlc3MKCiMjIyMjIyMjIyMjIyMjIyAgICAgZm9sbG93aW5nIDcgbGluZXMgZm9yIHRl c3RpbmcgIG9ubHkgICAgIyMjIyMjIyMjIyMjIyMjCiMJS2lsbCB0aGUgdW5ib3VuZC1kaGNwLWxl YXNlcy1icmlkZ2UgcHJvY2VzcwpwZ3JlcCAtZiB1bmJvdW5kLWRoY3AtbGVhc2VzLWJyaWRnZSAm JgoJa2lsbCAtcyBTSUdURVJNICQocGdyZXAgLWQnLCcgLWYgdW5ib3VuZC1kaGNwLWxlYXNlcy1i cmlkZ2UpCgojCWNobW9kIC12IDc0NCAvcm9vdC9kaGNwZGNvbmYvZGhjcEV2ZW50X3ZOLnNoCiMJ bG4gLXZzZiAvcm9vdC9kaGNwZGNvbmYvZGhjcEV2ZW50X3ZOLnNoIC9yb290L2RoY3BkY29uZi9k aGNwRXZlbnQuc2gKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgpkaGNwQ1JFc3RhdHVzPSIkezE6LX0iCmNs aWVudElQPSIkezI6LX0iCmNsaWVudEhvc3RuYW1lPSIkezM6LX0iCgp1bmJvdW5kREhDUGxlYXNl cz0iL2V0Yy91bmJvdW5kL2RoY3AtbGVhc2VzLmNvbmYiCnVuYm91bmRTdGF0aWNIb3N0cz0iL2V0 Yy91bmJvdW5kL2hvc3RzLmNvbmYiCgojCXRpbWUgdG8gbGl2ZSAoc2Vjb25kcykKVFRMPSI2MCIJ Iwl0aW1lIHRvIGxpdmUgKHNlY29uZHMpCgp0YWdOYW1lPSJkaGNwRXYyNSIJIwl0byBiZSAiZGhj cEV2ZW50IgoKIyMjIyMjIyMjIyMjIyMjICAgICBGdW5jdGlvbnMgICAgICMjIyMjIyMjIyMjIyMj IwoKIwl3cml0ZSBBICYgUFRSIHJlY29yZHMgdG8gdW5ib3VuZAojCndyaXRlLXVuYm91bmQgKCkg ewoJbG9jYWwgSVBhZGRyCglsb2NhbCBjbGllbnROYW1lCglsb2NhbCByZXZJUAoJbG9jYWwgcmVj QQoJbG9jYWwgcmVjUFRSCgoJSVBhZGRyPSQxCgljbGllbnROYW1lPSQyCgoJIwljcmVhdGUgcmV2 ZXJzZSBJUCBmb3IgYXJwYSBuYW1lCglyZXZJUD0kKCBlY2hvICIke0lQYWRkcn0iIHwgL3Vzci9i aW4vYXdrIC1GLiAne3ByaW50ICQ0Ii4iJDMiLiIkMiIuIiQxfScgKQoKCSMJY3JlYXRlICJBIiBy ZWNvcmQgYW5kICJQVFIiIHJlY29yZCBmb3IgdW5ib3VuZAoJcmVjQT0iJHtjbGllbnROYW1lfS4k e0RPTUFJTk5BTUV9LiAke1RUTH0gSU4gQSAke0lQYWRkcn0iCglyZWNQVFI9IiR7cmV2SVB9Lmlu LWFkZHIuYXJwYS4gJHtUVEx9IElOIFBUUiAke2NsaWVudE5hbWV9LiR7RE9NQUlOTkFNRX0uIgoK CSMJc2VuZCBBICYgUFRSIHJlY29yZHMgdG8gdW5ib3VuZCBhbmQgZGhjcC1sZWFzZXMgZmlsZQoJ ZWNobyAtZSAiJHtyZWNBfVxuJHtyZWNQVFJ9IiB8IC91c3Ivc2Jpbi91bmJvdW5kLWNvbnRyb2wg bG9jYWxfZGF0YXMKCWVjaG8gImxvY2FsLWRhdGE6IFwiJHtyZWNBfVwiIiA+PiAiJHt1bmJvdW5k REhDUGxlYXNlc30iCgllY2hvICJsb2NhbC1kYXRhOiBcIiR7cmVjUFRSfVwiIiA+PiAiJHt1bmJv dW5kREhDUGxlYXNlc30iCgoJbXNnX2xvZyAiJHtkaGNwQ1JFc3RhdHVzfTogYWRkZWQgQSAmIFBU UiByZWNvcmRzIHRvIHVuYm91bmQiCn0KCiMJZGVsZXRlIEEgJiBQVFIgcmVjb3JkcyBmcm9tIHVu Ym91bmQsIGJ5IElQIGFkZHJlc3MKIwpkZWxldGVfdW5ib3VuZCAoKSB7Cglsb2NhbCBJUGFkZHIK CWxvY2FsIHJldklQCglsb2NhbCBmcWRuCglsb2NhbCBkZWxldGVMaXN0CgoJbG9jYWwgSVBhZGRy PSQxCgoJIwluZWVkIElQIGFkZHJlc3MgdG8gZ2V0IEZRRE4gYW5kIGFycGEgbmFtZQoJcmV2SVA9 JCggZWNobyAiJHtJUGFkZHJ9IiB8IC91c3IvYmluL2F3ayAtRi4gJ3twcmludCAkNCIuIiQzIi4i JDIiLiIkMX0nICkKCWZxZG49JCggL2Jpbi9ncmVwIC0td29yZC1yZWdleHAgLS1pZ25vcmUtY2Fz ZSAiJHtJUGFkZHJ9IiA8PDwgIiR7dWNMaXN0fSIgfCBcCgkJL3Vzci9iaW4vYXdrICd7IHByaW50 ICQxIH0nICkKCgkjCWRvZXMgYSBGUUROIGV4aXN0IGZvciB0aGlzIElQIGFkZHJlc3M/ICBJZiB5 ZXMsIHRoZW4gcmVtb3ZlCglpZiBbWyAtbiAiJHtmcWRufSIgXV0gOyB0aGVuCgkJIwlyZW1vdmUg ZnFkbiBuYW1lcyBmcm9tIHVuYm91bmQgQU5EIGRoY3AtbGVhc2VzIGZpbGUKCgkJIwlsb29rIGZv ciBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgZnFkbiAoY2xpZW50IGhvc3RuYW1lLmRvbWFpbikKCQlk ZWxldGVMaXN0PSQoIC9iaW4vZ3JlcCAtLXdvcmQtcmVnZXhwIC0taWdub3JlLWNhc2UgIiR7ZnFk bn0iIDw8PCAiJHt1Y0xpc3R9IiB8IFwKCQkJL3Vzci9iaW4vYXdrICd7IHByaW50ICQxIH0nICkK CgkJIwlkZWxldGUgZnJvbSB1bmJvdW5kIGNhY2hlCgkJZWNobyAiJHtkZWxldGVMaXN0fSIgfCAv dXNyL3NiaW4vdW5ib3VuZC1jb250cm9sIGxvY2FsX2RhdGFzX3JlbW92ZQoKCQkjCWRlbGV0ZSBm cm9tIGRoY3AtbGVhc2VzLmNvbmYgZmlsZQoJCS9iaW4vc2VkIC0taW4tcGxhY2UgIi9cYiR7ZnFk bn0vZCIgIiR7dW5ib3VuZERIQ1BsZWFzZXN9IgoJZWxzZQoJCW1zZ19sb2cgIiR7ZGhjcENSRXN0 YXR1c306IE9vcHMsIG5vIEZRRE4gLSBleGl0IgoJCXJldHVybiAxCglmaQoJbXNnX2xvZyAiJHtk aGNwQ1JFc3RhdHVzfTogcmVmZXJlbmNlcyB0byAke2ZxZG59IHJlbW92ZWQgZnJvbSB1bmJvdW5k Igp9CgojCXNlbmQgbWVzc2FnZSB0byBtZXNzYWdlIGxvZwptc2dfbG9nICgpIHsKCWlmIHR0eSAt LXNpbGVudCA7IHRoZW4KCQllY2hvICIke3RhZ05hbWV9OiIgIiQqIgoJZWxzZQoJCS91c3IvYmlu L2xvZ2dlciAtLXRhZyAiJHt0YWdOYW1lfSIgIiQqIgoJZmkKfQoKIyMjIyMjIyMjIyMjIyMjICAg ICBNYWluICAgICAjIyMjIyMjIyMjIyMjIyMKCiMJY2hlY2sgcGFyYW1ldGVyIGNvdW50CmlmICgo ICIkIyIgPCAyICkpIHx8ICgoICQjID4gMyApKTsgdGhlbgogICAgbXNnX2xvZyAiSWxsZWdhbCBu dW1iZXIgb2YgcGFyYW1ldGVycyAtIGV4aXQiCglleGl0IDEKZmkKCiMJc2ltcGxlIGNoZWNrIGZv ciB2YWxpZCBJUCBhZGRyICggbWF5IGJlIHRvbyBzaW1wbGUhICkKaWYgISAvYmluL2dyZXAgLS1x dWlldCAtLWV4dGVuZGVkLXJlZ2V4cCAnWzAtOV17MSwzfVwuWzAtOV17MSwzfVwuWzAtOV17MSwz fVwuWzAtOV17MSwzfScgPDw8ICIke2NsaWVudElQfSIgOyB0aGVuCgltc2dfbG9nICIke2NsaWVu dElQfSBpcyBhbiBpbnZhbGlkIElQIGFkZHJlc3MgLSBleGl0IgoJZXhpdApmaQoKIwluZWVkIERP TUFJTk5BTUUgdmFsdWUKZXZhbCAiJCgvdXNyL2xvY2FsL2Jpbi9yZWFkaGFzaCAvdmFyL2lwZmly ZS9tYWluL3NldHRpbmdzKSIKCiMJcmVtb3ZlIGludmFsaWQgY2hhcmFjdGVycyBpbiBjbGllbnQg aG9zdG5hbWUKY2xpZW50SG9zdG5hbWU9JCggZWNobyAiJHtjbGllbnRIb3N0bmFtZX0iIHwgL2Jp bi9zZWQgJ3MvW15BLVphLXowLTkuLV0vL2cnICkKCiMJZ2V0IGV4aXN0aW5nIHJlY29yZHMgZnJv bSB1bmJvdW5kLWNvbnRyb2wgbGlzdF9sb2NhbF9kYXRhCnVjTGlzdD0kKCAvdXNyL3NiaW4vdW5i b3VuZC1jb250cm9sIGxpc3RfbG9jYWxfZGF0YSB8IC9iaW4vZ3JlcCAtaSAiJHtET01BSU5OQU1F fSIgfCBleHBhbmQgLXQxICkKCiMJRG9lcyB0aGlzIFJlY29yZCBBIGFscmVhZHkgZXhpc3Q/ClVD X1JlY0E9JCggL2Jpbi9ncmVwIC0taWdub3JlLWNhc2UgIl4ke2NsaWVudEhvc3RuYW1lfVwuJHtE T01BSU5OQU1FfS4qJHtjbGllbnRJUH0kIiA8PDwgIiR7dWNMaXN0fSIgKQoKIwlmaW5kIElQIGFk ZHIgaW4gdW5ib3VuZApVQ19JUD0kKCAvYmluL2dyZXAgLS13b3JkLXJlZ2V4cCAtLWlnbm9yZS1j YXNlICIke2NsaWVudElQfSIgPDw8ICIke3VjTGlzdH0iICkKCiMJZmluZCBjbGllbnQgbmFtZSwg YXQgc3RhcnQgb2YgbGluZSwgaW4gdW5ib3VuZCAobG9va2luZyBmb3IgcmVjb3JkIEEpClVDX0ZR RE49JCggL2Jpbi9ncmVwIC0td29yZC1yZWdleHAgLS1pZ25vcmUtY2FzZSAiXiR7Y2xpZW50SG9z dG5hbWV9XC4ke0RPTUFJTk5BTUV9IiA8PDwgIiR7dWNMaXN0fSIgKQoKY2FzZSAiJHtkaGNwQ1JF c3RhdHVzfSIgaW4KCWNvbW1pdCkKCgkJIwlpZiBjbGllbnQgaG9zdG5hbWUgaXMgYmxhbmsgdGhl biBleGl0CgkJaWYgW1sgLXogIiR7Y2xpZW50SG9zdG5hbWV9IiBdXSA7IHRoZW4KCQkJbXNnX2xv ZyAiJHtkaGNwQ1JFc3RhdHVzfTogcmVjZWl2ZWQgSVAgJHtjbGllbnRJUH0gYnV0IG1pc3Npbmcg Y2xpZW50IGhvc3RuYW1lIC0gZXhpdCIKCQkJZXhpdAoJCWZpCgoJCSMJaWYgY2xpZW50IGV4aXN0 cyBpbiBzdGF0aWMgaG9zdHMgdGhlbiBleGl0CgkJaWYgL2Jpbi9ncmVwIC0td29yZC1yZWdleHAg LS1xdWlldCAtLWlnbm9yZS1jYXNlIC1lICIke2NsaWVudElQfSIgLWUgIiR7Y2xpZW50SG9zdG5h bWV9IiAiJHt1bmJvdW5kU3RhdGljSG9zdHN9IgoJCXRoZW4KCQkJbXNnX2xvZyAiJHtkaGNwQ1JF c3RhdHVzfTogJHtjbGllbnRIb3N0bmFtZX0gb3IgJHtjbGllbnRJUH0gZm91bmQgaW4gc3RhdGlj IGhvc3RzIC0gZXhpdCIKCQkJZXhpdAoJCWZpCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkjIChpcCAg IGZxZG4pCgkJaWYgW1sgLW4gIiR7VUNfUmVjQX0iIF1dIDsgdGhlbgoJCSMJZXhpc3RpbmcgSVAg YW5kIGV4aXN0aW5nIEZRRE4JCQkJCQkJCQkJCQkjICggMSAgIDEgKQoJCQltc2dfbG9nICIke2Ro Y3BDUkVzdGF0dXN9OiB1bmJvdW5kIGhvc3RuYW1lICYgSVAgYWxyZWFkeSBleGlzdCAtIGV4aXQi CgkJCWV4aXQKCQllbHNlCgoJCQlpZiBbWyAteiAiJHtVQ19JUH0iIF1dIDsgdGhlbgoJCQkJIwlO ZXcgSVAgYWRkcmVzcyEgLSB3cml0ZSBpbmZvIHRvIHVuYm91bmQgJiBkaGNwLWxlYXNlcy5jb25m CQkJIyAoIDAgICAwLzEgKQoJCQkJd3JpdGUtdW5ib3VuZCAiJHtjbGllbnRJUH0iICIke2NsaWVu dEhvc3RuYW1lfSIKCQkJZWxzZQoJCQkJIwlFeGlzdGluZyBJUCBhZGRyZXNzIQoJCQkJaWYgW1sg LXogIiR7VUNfRlFETn0iIF1dIDsgdGhlbgoJCQkJIwlFeGlzdGluZyBJUCBhbmQgbmV3IEZRRE4K CQkJCQkjCWhvc3RuYW1lL2ZxZG4gY2hhbmdlZCAtIGRlbGV0ZSBBICYgUFRSIHJlY29yZHMgZnJv bSB1bmJvdW5kCQkjICggMSAgIDAgKQoJCQkJCWRlbGV0ZV91bmJvdW5kICIke2NsaWVudElQfSIK CgkJCQkJIwlhZGQgbmV3IHRvIHVuYm91bmQhCgkJCQkJd3JpdGUtdW5ib3VuZCAiJHtjbGllbnRJ UH0iICIke2NsaWVudEhvc3RuYW1lfSIKCQkJCWZpCgkJCWZpCgkJZmkKCQk7OwoKCXJlbGVhc2V8 ZXhwaXJ5KQoJCSMJTk9URTogZXhwaXJ5ICYgcmVsZWFzZSBhcmUgdGhlIHNhbWUgc2luY2UgSSBk b24ndCB1bmRlcnN0YW5kIHRoZSBkaWZmZXJlbmNlICAgIDotKAoKCQlpZiBbWyAteiAiJHtjbGll bnRJUH0iIF1dIDsgdGhlbgoJCQltc2dfbG9nICIke2RoY3BDUkVzdGF0dXN9OiBtaXNzaW5nIGNs aWVudCBJUCBhZGRyZXNzIC0gZXhpdCIKCQkJZXhpdCAxCgkJZmkKCgkJIwlkb2VzIElQIGFkZHIg YXBwZWFyIGluIHVuYm91bmQ/ICBpZiB5ZXMsIGRlbGV0ZSBsaW5lcwoJCWlmIFtbIC1uICIke1VD X0lQfSIgXV0gOyB0aGVuCgkJCWRlbGV0ZV91bmJvdW5kICIke2NsaWVudElQfSIKCQllbHNlCgkJ CW1zZ19sb2cgIiR7ZGhjcENSRXN0YXR1c306ICR7Y2xpZW50SVB9IG5vdCBmb3VuZCBpbiB1bmJv dW5kIC0gZG9uZSIKCQlmaQoJCTs7CgoJKikKCQltc2dfbG9nICJDUkUgc2NyaXB0OiBjYXNlID0g bm8gc3RhdHVzIC0gZXhpdCIKCQlleGl0CgkJOzsKZXNhYwoKZXhpdAo= --===============0431757945420925675==--