Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lokUK-0004lE-1m for pgadmin-hackers@arkaria.postgresql.org; Thu, 03 Jun 2021 10:22:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lokUJ-0007fu-08 for pgadmin-hackers@arkaria.postgresql.org; Thu, 03 Jun 2021 10:22:07 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lokUI-0007fk-HH for pgadmin-hackers@lists.postgresql.org; Thu, 03 Jun 2021 10:22:06 +0000 Received: from mail-yb1-xb33.google.com ([2607:f8b0:4864:20::b33]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1lokUE-00022H-NW for pgadmin-hackers@postgresql.org; Thu, 03 Jun 2021 10:22:04 +0000 Received: by mail-yb1-xb33.google.com with SMTP id g38so8052801ybi.12 for ; Thu, 03 Jun 2021 03:22:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=7alfa+ERyeO1fF2tj1RCMnQ6oF8+jqTZKHdlcoUlu7k=; b=RnqMv8cXaOf11TQkWis5tZWcxLe92B6xrJNqRzpczb+ohVaui7X2RSe+dPbrcKiZxQ PKvw0oWYjMrhnk1KOZ86BLn6IgtBldqDZ1BvhacEFtEWQyQbkqJGg0EoUsylVLmPxm58 RtGWyHPswRCMyTa1n8JRdmfCdEoe9Hetj6sA+jZOGUoRBBImldUwMYNNF+gAJBK9/OsT vpmoW1ZPkBa5u6ePQmFJy6Zi/7bpXKhf9ic5f8dDSEjF4qa1icdX5PbjyZkV7547NTgu 0Le2QcYUNSCXUmLd6XB1HXrtl7pcZ2AaSGaPzHYWXmFI5DQwCK4/27Fg2qzeoF5Hw1fq O7DQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=7alfa+ERyeO1fF2tj1RCMnQ6oF8+jqTZKHdlcoUlu7k=; b=oXu8mQb8IdRDEHvPiz8ksm+9/khVxocbSbsU9r2FD4j7+CzTOvWScC4sFRSSv+wjLd bFKX/KuBKv//vEsSD/z+GUVglL2u+92fOBVXmUjUOicBKfhcWpQqArRESHTQFA35wQ3n nsimfWE7fHsko8mBQDjuZLQ+q1KM2sMltmkYaPoLu39fpjqAfUtfz0zk0YqohHFLQgdc MDlBWeOlEPiZ9owjZByV/er+dNDz+lv0KzM1f30KtE4UqrPTVozfaTFF9N844oD/SmcO f6IPMUn/Grlk0dh/+dUIh1wiGft1BBolaRmHo2fmouZb9HceGWsQtx3rUGYXb2xF+0ng babA== X-Gm-Message-State: AOAM533CVHpZ1qd3KE3cm16jjhCmRJIa7m0IMia6lgeQ7wWZJdmIgwnE KBTMaI8uHQsHecqJEVzTz7SFpjpJj/rjzZ3oEUcPdNXyBe5aq/+JNYHOggrkEHJHqw7tbHFnCSI iyVOSy7y9rouxbsSBpkof0Ta6S4xSrCzq8b1MKiUNZC5jeUl0B+yoooG2HHp7YZpI47ckwOZ4ne ckzePL8B/2FORyy62ti/OOk3CjVpYFeKdvNp4QaKx3m/l1DGfV7BFEvDBMadpY1CI= X-Google-Smtp-Source: ABdhPJwE06qUiWnChae7eXVIV54cj0hvs4aqJtZsMvlCQk0ip5IiiuELt3T7segpK5bAReUKRC50Jw0rhQMEdjg4y4w= X-Received: by 2002:a25:6603:: with SMTP id a3mr10281034ybc.155.1622715721445; Thu, 03 Jun 2021 03:22:01 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Nikhil Mohite Date: Thu, 3 Jun 2021 15:51:50 +0530 Message-ID: Subject: Re: [pgAdmin][RM-6460]: Need a mechanism to detect a corrupt/broken config DB file. To: pgadmin-hackers Cc: Dave Page Content-Type: multipart/mixed; boundary="000000000000261a6f05c3d9f299" X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000261a6f05c3d9f299 Content-Type: multipart/alternative; boundary="000000000000261a6d05c3d9f297" --000000000000261a6d05c3d9f297 Content-Type: text/plain; charset="UTF-8" Hi Team, PFA updated patch (v2) On Thu, Jun 3, 2021 at 3:10 PM Nikhil Mohite wrote: > Hi Dave, > > On Thu, Jun 3, 2021 at 2:49 PM Dave Page wrote: > >> Hi >> >> On Thu, Jun 3, 2021 at 10:01 AM Nikhil Mohite < >> nikhil.mohite@enterprisedb.com> wrote: >> >>> Hi Dave, >>> >>> On Thu, Jun 3, 2021 at 1:47 PM Dave Page wrote: >>> >>>> Hi >>>> >>>> On Thu, Jun 3, 2021 at 7:39 AM Nikhil Mohite < >>>> nikhil.mohite@enterprisedb.com> wrote: >>>> >>>>> Hi Hackers, >>>>> >>>>> Please find the attached patch for RM-6460 >>>>> : Need a mechanism to >>>>> detect a corrupt/broken config DB file. >>>>> >>>>> 1. Added checks if all tables added in the model are present in SQLite >>>>> DB or not. >>>>> 2. If migrations fail it will backup older file and try migrations >>>>> with the newly created file. >>>>> (User will get notification on UI for the location of the backup file >>>>> and newly created.) >>>>> 3. If the user deleted any table from SQLite DB pgAdmin will not run >>>>> on the next restart and it will add the missing table list in the logs. >>>>> >>>> >>>> Surely if any tables have been deleted, it'll fail the check in point 1? >>>> >>> Yes, but if the user deletes any table while pgAdmin is running then it >>> will fail when the user tries to run pgAdmin next time. >>> >> >> Right - but how is the end result of that different from a failed >> migration that left a table missing? Either way, the end result is the >> same, and should be handled the same way; i.e. backup/recreate the DB, then >> warn the user as soon as the UI is up. >> > Yes - It should be the same in both conditions, I will send an updated > patch for this. > >> > >> I believe the process is simple (and maybe this is what is done and this >> is just a language issue - I haven't read the patch in detail): >> >> - On startup, attempt to create the database/run any migrations as >> appropriate. >> - Check that all tables exist, and the schema version is correct. >> - If there's a problem, backup the file, create a new one from scratch, >> and warn the user. >> >> One thing I did notice when skimming the patch - we have this in the code: >> >> + raise RuntimeError( >> + 'Specified SQLite database file is not valid.') >> >> The *user* didn't specify a SQLite database file (nor do they care that >> it's SQLite at this point). That (and any other similar messages) should >> probably be rephrased to say something like: >> >> "The configuration database file is not valid." >> > >> Thanks! >> >> >> >>> (If we remove the table from the model it will not check particular >>> table is present in DB or not. ) >>> >>>> >>>> -- >>>> Dave Page >>>> Blog: https://pgsnake.blogspot.com >>>> Twitter: @pgsnake >>>> >>>> EDB: https://www.enterprisedb.com >>>> >>>> Regards, >>> Nikhil Mohite. >>> >> >> >> -- >> Dave Page >> Blog: https://pgsnake.blogspot.com >> Twitter: @pgsnake >> >> EDB: https://www.enterprisedb.com >> >> Regards, > Nikhil Mohite > Regards, Nikhil Mohite --000000000000261a6d05c3d9f297 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Team,
=

P= FA updated patch (v2)
On Thu, Ju= n 3, 2021 at 3:10 PM Nikhil Mohite <nikhil.mohite@enterprisedb.com> wrote:
Hi Dave,

On Thu, Jun 3, 2021 at 2:49 PM Dave Page <dpage@pgadmin.org> wrote:
Hi

On Thu, Jun 3, 2021 at 10:01 AM Nikhil Mohite <nikhil.mohite= @enterprisedb.com> wrote:
Hi Dave,

On Thu, Jun 3, 2= 021 at 1:47 PM Dave Page <dpage@pgadmin.org> wrote:
Hi

On Thu, Jun 3= , 2021 at 7:39 AM Nikhil Mohite <nikhil.mohite@enterprisedb.com> wrote:<= br>
Hi Hackers,

Please find the attached patch for=C2=A0RM-64= 60:=C2=A0 Need a mechanism to detect a corrupt/broken config DB file.

1. Added checks if all tables added in the model ar= e present in SQLite DB or not.
2. If migrations fail it will back= up older file and try migrations with the newly created file.=C2=A0
(User will get notification on UI=C2=A0for the location=C2=A0of the back= up file and newly created.)
3. If the user deleted any table from= SQLite DB pgAdmin will not run on the next restart and it will add the mis= sing table list in the logs.

Su= rely if any tables have been deleted, it'll fail the check in point 1?<= /div>
Yes, but if the user deletes any table w= hile pgAdmin is running then it will fail when the user tries to run pgAdmi= n next time.

Right - but = how is the end result of that different from a failed migration that=C2=A0l= eft a table missing? Either way, the end result is the same, and should be = handled the same way; i.e. backup/recreate the DB, then warn the user as so= on as the UI is up.
Yes - It shoul= d be the same in both conditions, I will send an updated patch for this.=C2= =A0
=C2=A0
<= div class=3D"gmail_quote">

I believe the process is simp= le (and maybe this is what is done and this is just a language issue - I ha= ven't read the patch in detail):

- On startup,= attempt to create the database/run any migrations as appropriate.
- Check that all tables exist, and the schema version is correct.
- If there's a problem, backup the file, create a new one from scrat= ch, and warn the user.

One thing I did notice when= skimming the patch - we have this in the code:

+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0raise RuntimeEr= ror(
+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0'Specified SQLite database file is not valid.')
<= /div>

The *user* didn't specify a SQLite database fi= le (nor do they care that it's SQLite at this point). That (and any oth= er similar messages) should probably be rephrased to say something like:

"The configuration database file is not valid.&= quot;=C2=A0

Th= anks!

=C2=A0
(If we r= emove the table from the model it will not check particular table is presen= t in DB or not. )
=C2=A0
--
Dave Page
Blog: https://pgsnake.blogspot.com
Twitt= er: @pgsnake

EDB: https://www.enterprisedb.com

Regards,
Nikhil Mohite.=C2=A0


--
Dave Page
Blog: https://pgsnake.blogspot.com
Twitter: @pgsnake<= br>
EDB: http= s://www.enterprisedb.com

Regards,
Nikhil Mohite=C2=A0
Regards,
Nikhil Mohite=C2=A0
--000000000000261a6d05c3d9f297-- --000000000000261a6f05c3d9f299 Content-Type: application/octet-stream; name="RM_6460_v2.patch" Content-Disposition: attachment; filename="RM_6460_v2.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kpgqyl9y0 ZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL19faW5pdF9fLnB5IGIvd2ViL3BnYWRtaW4vX19pbml0 X18ucHkKaW5kZXggNmUzOTVmNDIuLmQwYzRhMjVlIDEwMDY0NAotLS0gYS93ZWIvcGdhZG1pbi9f X2luaXRfXy5weQorKysgYi93ZWIvcGdhZG1pbi9fX2luaXRfXy5weQpAQCAtMTQsNiArMTQsOCBA QCBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCByZQogaW1wb3J0IGlwYWRkcmVzcworaW1w b3J0IHRyYWNlYmFjaworCiBmcm9tIHR5cGVzIGltcG9ydCBNZXRob2RUeXBlCiBmcm9tIGNvbGxl Y3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAogZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9t b2R1bGUKQEAgLTM4LDggKzQwLDggQEAgZnJvbSBwZ2FkbWluLnV0aWxzIGltcG9ydCBQZ0FkbWlu TW9kdWxlLCBkcml2ZXIsIEtleU1hbmFnZXIKIGZyb20gcGdhZG1pbi51dGlscy5wcmVmZXJlbmNl cyBpbXBvcnQgUHJlZmVyZW5jZXMKIGZyb20gcGdhZG1pbi51dGlscy5zZXNzaW9uIGltcG9ydCBj cmVhdGVfc2Vzc2lvbl9pbnRlcmZhY2UsIHBnYV91bmF1dGhvcmlzZWQKIGZyb20gcGdhZG1pbi51 dGlscy52ZXJzaW9uZWRfdGVtcGxhdGVfbG9hZGVyIGltcG9ydCBWZXJzaW9uZWRUZW1wbGF0ZUxv YWRlcgotZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCi1mcm9tIHBnYWRtaW4uc2V0dXAg aW1wb3J0IGdldF92ZXJzaW9uLCBzZXRfdmVyc2lvbgorZnJvbSBkYXRldGltZSBpbXBvcnQgdGlt ZWRlbHRhLCBkYXRldGltZQorZnJvbSBwZ2FkbWluLnNldHVwIGltcG9ydCBnZXRfdmVyc2lvbiwg c2V0X3ZlcnNpb24sIGNoZWNrX2RiX3RhYmxlcwogZnJvbSBwZ2FkbWluLnV0aWxzLmFqYXggaW1w b3J0IGludGVybmFsX3NlcnZlcl9lcnJvciwgbWFrZV9qc29uX3Jlc3BvbnNlCiBmcm9tIHBnYWRt aW4udXRpbHMuY3NyZiBpbXBvcnQgcGdDU1JGUHJvdGVjdAogZnJvbSBwZ2FkbWluIGltcG9ydCBh dXRoZW50aWNhdGUKQEAgLTM0OSw2ICszNTEsNDQgQEAgZGVmIGNyZWF0ZV9hcHAoYXBwX25hbWU9 Tm9uZSk6CiAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAjIFVwZ3JhZGUgdGhlIHNjaGVtYSAo aWYgcmVxdWlyZWQpCiAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgYmFja3VwX2RiX2Zp bGUoKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIGJhY2t1cCBvZiB0aGUgY3VycmVu dCBkYXRhYmFzZSBmaWxlCisgICAgICAgIGFuZCBjcmVhdGUgbmV3IGRhdGFiYXNlIGZpbGUgd2l0 aCBkZWZhdWx0IHNldHRpbmdzLgorICAgICAgICAiIiIKKyAgICAgICAgYmFja3VwX2ZpbGVfbmFt ZSA9ICJ7MH0uezF9Ii5mb3JtYXQoCisgICAgICAgICAgICBTUUxJVEVfUEFUSCwgZGF0ZXRpbWUu bm93KCkuc3RyZnRpbWUoJyVZJW0lZCVIJU0lUycpKQorICAgICAgICBvcy5yZW5hbWUoU1FMSVRF X1BBVEgsIGJhY2t1cF9maWxlX25hbWUpCisgICAgICAgIGFwcC5sb2dnZXIuZXJyb3IoJ0V4Y2Vw dGlvbiBpbiBkYXRhYmFzZSBtaWdyYXRpb24uJykKKyAgICAgICAgYXBwLmxvZ2dlci5pbmZvKCdD cmVhdGluZyBuZXcgZGF0YWJhc2UgZmlsZS4nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBk Yl91cGdyYWRlKGFwcCkKKyAgICAgICAgICAgIG9zLmVudmlyb25bCisgICAgICAgICAgICAgICAg J0NPUlJVUFRFRF9EQl9CQUNLVVBfRklMRSddID0gYmFja3VwX2ZpbGVfbmFtZQorICAgICAgICAg ICAgYXBwLmxvZ2dlci5pbmZvKCdEYXRhYmFzZSBtaWdyYXRpb24gY29tcGxldGVkLicpCisgICAg ICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGFwcC5sb2dnZXIuZXJyb3Io J0RhdGFiYXNlIG1pZ3JhdGlvbiBmYWlsZWQnKQorICAgICAgICAgICAgYXBwLmxvZ2dlci5lcnJv cih0cmFjZWJhY2suZm9ybWF0X2V4YygpKQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9y KCdNaWdyYXRpb24gZmFpbGVkJykKKworICAgIGRlZiB1cGdyYWRlX2RiKCk6CisgICAgICAgICIi IgorICAgICAgICBFeGVjdXRlIHRoZSBtaWdyYXRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAg dHJ5OgorICAgICAgICAgICAgZGJfdXBncmFkZShhcHApCisgICAgICAgICAgICBvcy5lbnZpcm9u WydDT1JSVVBURURfREJfQkFDS1VQX0ZJTEUnXSA9ICcnCisgICAgICAgIGV4Y2VwdCBFeGNlcHRp b24gYXMgZToKKyAgICAgICAgICAgIGJhY2t1cF9kYl9maWxlKCkKKworICAgICAgICAjIGNoZWNr IGFsbCB0YWJsZXMgYXJlIHByZXNlbnQgaW4gdGhlIGRiLgorICAgICAgICBpc19kYl9lcnJvciwg aW52YWxpZF90Yl9uYW1lcyA9IGNoZWNrX2RiX3RhYmxlcygpCisgICAgICAgIGlmIGlzX2RiX2Vy cm9yOgorICAgICAgICAgICAgYXBwLmxvZ2dlci5lcnJvcigKKyAgICAgICAgICAgICAgICAnVGFi bGUocykgezB9IGFyZSBtaXNzaW5nIGluIHRoZScKKyAgICAgICAgICAgICAgICAnIGRhdGFiYXNl Jy5mb3JtYXQoaW52YWxpZF90Yl9uYW1lcykpCisgICAgICAgICAgICBiYWNrdXBfZGJfZmlsZSgp CisKICAgICB3aXRoIGFwcC5hcHBfY29udGV4dCgpOgogICAgICAgICAjIFJ1biBtaWdyYXRpb24g Zm9yIHRoZSBmaXJzdCB0aW1lIGkuZS4gY3JlYXRlIGRhdGFiYXNlCiAgICAgICAgIGZyb20gY29u ZmlnIGltcG9ydCBTUUxJVEVfUEFUSApAQCAtMzU2LDI1ICszOTYsMzQgQEAgZGVmIGNyZWF0ZV9h cHAoYXBwX25hbWU9Tm9uZSk6CiAKICAgICAgICAgIyBJZiB2ZXJzaW9uIG5vdCBhdmFpbGFibGUs IHVzZXIgbXVzdCBoYXZlIGFib3J0ZWQuIFRhYmxlcyBhcmUgbm90CiAgICAgICAgICMgY3JlYXRl ZCBhbmQgc28gaXRzIGFuIGVtcHR5IGRiCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhT UUxJVEVfUEFUSCkgb3IgZ2V0X3ZlcnNpb24oKSA9PSAtMToKKyAgICAgICAgdmVyc2lvbiA9IGdl dF92ZXJzaW9uKCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKFNRTElURV9QQVRIKSBv ciB2ZXJzaW9uID09IC0xOgogICAgICAgICAgICAgIyBJZiBydW5uaW5nIGluIGNsaSBtb2RlIHRo ZW4gZG9uJ3QgdHJ5IHRvIHVwZ3JhZGUsIGp1c3QgcmFpc2UKICAgICAgICAgICAgICMgdGhlIGV4 Y2VwdGlvbgogICAgICAgICAgICAgaWYgbm90IGNsaV9tb2RlOgotICAgICAgICAgICAgICAgIGRi X3VwZ3JhZGUoYXBwKQorICAgICAgICAgICAgICAgIHVwZ3JhZGVfZGIoKQogICAgICAgICAgICAg ZWxzZToKICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoU1FMSVRFX1BBVEgp OgogICAgICAgICAgICAgICAgICAgICByYWlzZSBGaWxlTm90Rm91bmRFcnJvcigKICAgICAgICAg ICAgICAgICAgICAgICAgICdTUUxpdGUgZGF0YWJhc2UgZmlsZSAiJyArIFNRTElURV9QQVRIICsK ICAgICAgICAgICAgICAgICAgICAgICAgICciIGRvZXMgbm90IGV4aXN0cy4nKQotICAgICAgICAg ICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignU3BlY2lmaWVkIFNRTGl0ZSBkYXRhYmFzZSBmaWxl ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCB2YWxpZC4nKQor ICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAg J1RoZSBjb25maWd1cmF0aW9uIGRhdGFiYXNlIGZpbGUgaXMgbm90IHZhbGlkLicpCiAgICAgICAg IGVsc2U6CiAgICAgICAgICAgICBzY2hlbWFfdmVyc2lvbiA9IGdldF92ZXJzaW9uKCkKIAogICAg ICAgICAgICAgIyBSdW4gbWlncmF0aW9uIGlmIGN1cnJlbnQgc2NoZW1hIHZlcnNpb24gaXMgZ3Jl YXRlciB0aGFuIHRoZQogICAgICAgICAgICAgIyBzY2hlbWEgdmVyc2lvbiBzdG9yZWQgaW4gdmVy c2lvbiB0YWJsZQogICAgICAgICAgICAgaWYgQ1VSUkVOVF9TQ0hFTUFfVkVSU0lPTiA+PSBzY2hl bWFfdmVyc2lvbjoKLSAgICAgICAgICAgICAgICBkYl91cGdyYWRlKGFwcCkKKyAgICAgICAgICAg ICAgICB1cGdyYWRlX2RiKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBj aGVjayBhbGwgdGFibGVzIGFyZSBwcmVzZW50IGluIHRoZSBkYi4KKyAgICAgICAgICAgICAgICBp c19kYl9lcnJvciwgaW52YWxpZF90Yl9uYW1lcyA9IGNoZWNrX2RiX3RhYmxlcygpCisgICAgICAg ICAgICAgICAgaWYgaXNfZGJfZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGFwcC5sb2dnZXIu ZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAnVGFibGUocykgezB9IGFyZSBtaXNzaW5n IGluIHRoZScKKyAgICAgICAgICAgICAgICAgICAgICAgICcgZGF0YWJhc2UnLmZvcm1hdChpbnZh bGlkX3RiX25hbWVzKSkKKyAgICAgICAgICAgICAgICAgICAgYmFja3VwX2RiX2ZpbGUoKQogCiAg ICAgICAgICAgICAjIFVwZGF0ZSBzY2hlbWEgdmVyc2lvbiB0byB0aGUgbGF0ZXN0CiAgICAgICAg ICAgICBpZiBDVVJSRU5UX1NDSEVNQV9WRVJTSU9OID4gc2NoZW1hX3ZlcnNpb246CmRpZmYgLS1n aXQgYS93ZWIvcGdhZG1pbi9icm93c2VyL19faW5pdF9fLnB5IGIvd2ViL3BnYWRtaW4vYnJvd3Nl ci9fX2luaXRfXy5weQppbmRleCBlZGJkNDkxZS4uNWE2YTFjNDYgMTAwNjQ0Ci0tLSBhL3dlYi9w Z2FkbWluL2Jyb3dzZXIvX19pbml0X18ucHkKKysrIGIvd2ViL3BnYWRtaW4vYnJvd3Nlci9fX2lu aXRfXy5weQpAQCAtMzQyLDYgKzM0Miw3IEBAIGNsYXNzIEJyb3dzZXJNb2R1bGUoUGdBZG1pbk1v ZHVsZSk6CiAgICAgICAgICAgICBsaXN0OiBhIGxpc3Qgb2YgdXJsIGVuZHBvaW50cyBleHBvc2Vk IHRvIHRoZSBjbGllbnQuCiAgICAgICAgICIiIgogICAgICAgICByZXR1cm4gW0JST1dTRVJfSU5E RVgsICdicm93c2VyLm5vZGVzJywKKyAgICAgICAgICAgICAgICAnYnJvd3Nlci5jaGVja19jb3Jy dXB0ZWRfZGJfZmlsZScsCiAgICAgICAgICAgICAgICAgJ2Jyb3dzZXIuY2hlY2tfbWFzdGVyX3Bh c3N3b3JkJywKICAgICAgICAgICAgICAgICAnYnJvd3Nlci5zZXRfbWFzdGVyX3Bhc3N3b3JkJywK ICAgICAgICAgICAgICAgICAnYnJvd3Nlci5yZXNldF9tYXN0ZXJfcGFzc3dvcmQnLApAQCAtOTUw LDYgKzk1MSwxOSBAQCBkZWYgZm9ybV9tYXN0ZXJfcGFzc3dvcmRfcmVzcG9uc2UoZXhpc3Rpbmc9 VHJ1ZSwgcHJlc2VudD1GYWxzZSwgZXJybXNnPU5vbmUpOgogICAgIH0pCiAKIAorQGJsdWVwcmlu dC5yb3V0ZSgiL2NoZWNrX2NvcnJ1cHRlZF9kYl9maWxlIiwKKyAgICAgICAgICAgICAgICAgZW5k cG9pbnQ9ImNoZWNrX2NvcnJ1cHRlZF9kYl9maWxlIiwgbWV0aG9kcz1bIkdFVCJdKQorZGVmIGNo ZWNrX2NvcnJ1cHRlZF9kYl9maWxlKCk6CisgICAgIiIiCisgICAgR2V0IHRoZSBjb3JydXB0ZWQg ZGF0YWJhc2UgZmlsZSBwYXRoLgorICAgICIiIgorICAgIGZpbGVfbG9jYXRpb24gPSBvcy5lbnZp cm9uWydDT1JSVVBURURfREJfQkFDS1VQX0ZJTEUnXSBcCisgICAgICAgIGlmICdDT1JSVVBURURf REJfQkFDS1VQX0ZJTEUnIGluIG9zLmVudmlyb24gZWxzZSAnJworICAgICMgcmVzZXQgdGhlIGNv cnJ1cHRlZCBkYiBmaWxlIHBhdGggaW4gZW52LgorICAgIG9zLmVudmlyb25bJ0NPUlJVUFRFRF9E Ql9CQUNLVVBfRklMRSddID0gJycKKyAgICByZXR1cm4gbWFrZV9qc29uX3Jlc3BvbnNlKGRhdGE9 ZmlsZV9sb2NhdGlvbikKKworCiBAYmx1ZXByaW50LnJvdXRlKCIvbWFzdGVyX3Bhc3N3b3JkIiwg ZW5kcG9pbnQ9ImNoZWNrX21hc3Rlcl9wYXNzd29yZCIsCiAgICAgICAgICAgICAgICAgIG1ldGhv ZHM9WyJHRVQiXSkKIGRlZiBjaGVja19tYXN0ZXJfcGFzc3dvcmQoKToKZGlmZiAtLWdpdCBhL3dl Yi9wZ2FkbWluL2Jyb3dzZXIvc3RhdGljL2pzL2Jyb3dzZXIuanMgYi93ZWIvcGdhZG1pbi9icm93 c2VyL3N0YXRpYy9qcy9icm93c2VyLmpzCmluZGV4IDQ2ZGZiNGYxLi5iYTg0Y2E0MSAxMDA2NDQK LS0tIGEvd2ViL3BnYWRtaW4vYnJvd3Nlci9zdGF0aWMvanMvYnJvd3Nlci5qcworKysgYi93ZWIv cGdhZG1pbi9icm93c2VyL3N0YXRpYy9qcy9icm93c2VyLmpzCkBAIC01OTQsNyArNTk0LDcgQEAg ZGVmaW5lKCdwZ2FkbWluLmJyb3dzZXInLCBbCiAgICAgICB9LCAzMDAwMDApOwogCiAgICAgICBv Ymouc2V0X21hc3Rlcl9wYXNzd29yZCgnJyk7Ci0KKyAgICAgIG9iai5jaGVja19jb3JydXB0ZWRf ZGJfZmlsZSgpOwogICAgICAgb2JqLkV2ZW50cy5vbigncGdhZG1pbjpicm93c2VyOnRyZWU6YWRk Jywgb2JqLm9uQWRkVHJlZU5vZGUsIG9iaik7CiAgICAgICBvYmouRXZlbnRzLm9uKCdwZ2FkbWlu OmJyb3dzZXI6dHJlZTp1cGRhdGUnLCBvYmoub25VcGRhdGVUcmVlTm9kZSwgb2JqKTsKICAgICAg IG9iai5FdmVudHMub24oJ3BnYWRtaW46YnJvd3Nlcjp0cmVlOnJlZnJlc2gnLCBvYmoub25SZWZy ZXNoVHJlZU5vZGUsIG9iaik7CkBAIC02MDcsNyArNjA3LDM1IEBAIGRlZmluZSgncGdhZG1pbi5i cm93c2VyJywgWwogICAgICAgb2JqLnJlZ2lzdGVyX3RvX2FjdGl2aXR5X2xpc3RlbmVyKGRvY3Vt ZW50KTsKICAgICAgIG9iai5zdGFydF9pbmFjdGl2aXR5X3RpbWVvdXRfZGFlbW9uKCk7CiAgICAg fSwKKyAgICBjaGVja19jb3JydXB0ZWRfZGJfZmlsZTogZnVuY3Rpb24oKSB7CisgICAgICAkLmFq YXgoeworICAgICAgICB1cmw6IHVybF9mb3IoJ2Jyb3dzZXIuY2hlY2tfY29ycnVwdGVkX2RiX2Zp bGUnKSwKKyAgICAgICAgdHlwZTogJ0dFVCcsCisgICAgICAgIGRhdGFUeXBlOiAnanNvbicsCisg ICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsCisgICAgICB9KS5kb25lKChy ZXMpPT4geworICAgICAgICBpZihyZXMuZGF0YS5sZW5ndGggPiAwKSB7CisKKyAgICAgICAgICBB bGVydGlmeS5hbGVydCgKKyAgICAgICAgICAgICdXYXJuaW5nJywKKyAgICAgICAgICAgICdwZ0Fk bWluIGRldGVjdGVkIHVucmVjb3ZlcmFibGUgY29ycnVwdGlvbiBpbiBpdFwncyBTUUxpdGUgY29u ZmlndXJhdGlvbiBkYXRhYmFzZS4gJyArCisgICAgICAgICAgICAnVGhlIGRhdGFiYXNlIGhhcyBi ZWVuIGJhY2tlZCB1cCBhbmQgcmVjcmVhdGVkIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gJysKKyAg ICAgICAgICAgICdJdCBtYXkgYmUgcG9zc2libGUgdG8gcmVjb3ZlciBkYXRhIHN1Y2ggYXMgcXVl cnkgaGlzdG9yeSBtYW51YWxseSBmcm9tICcrCisgICAgICAgICAgICAndGhlIG9yaWdpbmFsL2Nv cnJ1cHQgZmlsZSB1c2luZyBhIHRvb2wgc3VjaCBhcyBEQiBCcm93c2VyIGZvciBTUUxpdGUgaWYg ZGVzaXJlZC4nKworICAgICAgICAgICAgJzxicj48YnI+T3JpZ2luYWwgZmlsZTogJyArIHJlcy5k YXRhICsgJzxicj5SZXBsYWNlbWVudCBmaWxlOiAnICsKKyAgICAgICAgICAgIHJlcy5kYXRhLnN1 YnN0cmluZygwLCByZXMuZGF0YS5sZW5ndGggLSAxNCkKKyAgICAgICAgICApCisgICAgICAgICAg ICAuc2V0KHsnY2xvc2FibGUnOiB0cnVlLAorICAgICAgICAgICAgICAnb25vayc6IGZ1bmN0aW9u KCkgeworICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisKIAorICAgICAgICB9Cisg ICAgICB9KS5mYWlsKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlcnJvcikgeworICAgICAgICBBbGVy dGlmeS5hbGVydChlcnJvcik7CisgICAgICB9KTsKKyAgICB9LAogICAgIGluaXRfbWFzdGVyX3Bh c3N3b3JkOiBmdW5jdGlvbigpIHsKICAgICAgIGxldCBzZWxmID0gdGhpczsKICAgICAgIC8vIE1h c3RlciBwYXNzd29yZCBkaWFsb2cKZGlmZiAtLWdpdCBhL3dlYi9wZ2FkbWluL3NldHVwL19faW5p dF9fLnB5IGIvd2ViL3BnYWRtaW4vc2V0dXAvX19pbml0X18ucHkKaW5kZXggMDQ1NzFlOWUuLjc3 OWE3MjE3IDEwMDY0NAotLS0gYS93ZWIvcGdhZG1pbi9zZXR1cC9fX2luaXRfXy5weQorKysgYi93 ZWIvcGdhZG1pbi9zZXR1cC9fX2luaXRfXy5weQpAQCAtMTEsMyArMTEsNCBAQCBmcm9tIC51c2Vy X2luZm8gaW1wb3J0IHVzZXJfaW5mbwogZnJvbSAuZGJfdmVyc2lvbiBpbXBvcnQgZ2V0X3ZlcnNp b24sIHNldF92ZXJzaW9uCiBmcm9tIC5kYl91cGdyYWRlIGltcG9ydCBkYl91cGdyYWRlCiBmcm9t IC5kYXRhX2RpcmVjdG9yeSBpbXBvcnQgY3JlYXRlX2FwcF9kYXRhX2RpcmVjdG9yeQorZnJvbSAu ZGJfdGFibGVfY2hlY2sgaW1wb3J0IGNoZWNrX2RiX3RhYmxlcwpkaWZmIC0tZ2l0IGEvd2ViL3Bn YWRtaW4vc2V0dXAvZGJfdGFibGVfY2hlY2sucHkgYi93ZWIvcGdhZG1pbi9zZXR1cC9kYl90YWJs ZV9jaGVjay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uNGRhODZjMjcK LS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zZXR1cC9kYl90YWJsZV9jaGVjay5weQpA QCAtMCwwICsxLDMyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwZ0FkbWluIDQgLSBQb3N0 Z3JlU1FMIFRvb2xzCisjCisjIENvcHlyaWdodCAoQykgMjAxMyAtIDIwMjEsIFRoZSBwZ0FkbWlu IERldmVsb3BtZW50IFRlYW0KKyMgVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciB0aGUg UG9zdGdyZVNRTCBMaWNlbmNlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmcm9tIHBnYWRtaW4u bW9kZWwgaW1wb3J0IFZlcnNpb24KK2Zyb20gcGdhZG1pbi5tb2RlbCBpbXBvcnQgZGIKKworCitk ZWYgZ2V0X2RiX3RhYmxlX25hbWVzKCk6CisgICAgZGJfdGFibGVfbmFtZXMgPSBkYi5tZXRhZGF0 YS50YWJsZXMua2V5cygpIGlmIGRiLm1ldGFkYXRhLnRhYmxlcyBlbHNlIDAKKyAgICByZXR1cm4g ZGJfdGFibGVfbmFtZXMKKworCitkZWYgY2hlY2tfZGJfdGFibGVzKCk6CisgICAgaXNfZXJyb3Ig PSBGYWxzZQorICAgIGludmFsaWRfdGJfbmFtZXMgPSBsaXN0KCkKKyAgICBkYl90YWJsZV9uYW1l cyA9IGdldF9kYl90YWJsZV9uYW1lcygpCisgICAgIyBjaGVjayB0YWJsZSBpcyBhY3R1YWxseSBw cmVzZW50IGluIHRoZSBkYi4KKyAgICBmb3IgdGFibGVfbmFtZSBpbiBkYl90YWJsZV9uYW1lczoK KyAgICAgICAgaWYgbm90IGRiLmVuZ2luZS5kaWFsZWN0Lmhhc190YWJsZShkYi5lbmdpbmUsIHRh YmxlX25hbWUpOgorICAgICAgICAgICAgaW52YWxpZF90Yl9uYW1lcy5hcHBlbmQodGFibGVfbmFt ZSkKKyAgICAgICAgICAgIGlzX2Vycm9yID0gVHJ1ZQorCisgICAgaWYgaXNfZXJyb3I6CisgICAg ICAgIHJldHVybiBUcnVlLCBpbnZhbGlkX3RiX25hbWVzCisgICAgZWxzZToKKyAgICAgICAgcmV0 dXJuIEZhbHNlLCBpbnZhbGlkX3RiX25hbWVzCmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zZXR1 cC9kYl92ZXJzaW9uLnB5IGIvd2ViL3BnYWRtaW4vc2V0dXAvZGJfdmVyc2lvbi5weQppbmRleCBh ZDI4MTFhMS4uNTA2MDc1ODMgMTAwNjQ0Ci0tLSBhL3dlYi9wZ2FkbWluL3NldHVwL2RiX3ZlcnNp b24ucHkKKysrIGIvd2ViL3BnYWRtaW4vc2V0dXAvZGJfdmVyc2lvbi5weQpAQCAtMTYsNyArMTYs MTAgQEAgZGVmIGdldF92ZXJzaW9uKCk6CiAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAg cmV0dXJuIC0xCiAKLSAgICByZXR1cm4gdmVyc2lvbi52YWx1ZQorICAgIGlmIHZlcnNpb246Cisg ICAgICAgIHJldHVybiB2ZXJzaW9uLnZhbHVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIC0x CiAKIAogZGVmIHNldF92ZXJzaW9uKG5ld192ZXJzaW9uKToK --000000000000261a6f05c3d9f299--