diff --git a/Assemblies/Scripts/Borealis/Remote_Agent_Update_WIN.json b/Assemblies/Scripts/Borealis/Remote_Agent_Update_WIN.json index 689fd54..ff0e0e6 100644 --- a/Assemblies/Scripts/Borealis/Remote_Agent_Update_WIN.json +++ b/Assemblies/Scripts/Borealis/Remote_Agent_Update_WIN.json @@ -4,7 +4,7 @@ "description": "Reaches out to the remote Borealis agent and triggers an automatic unattended update from the Github repository.", "category": "script", "type": "powershell", - "script": "W0NtZGxldEJpbmRpbmcoKV0KcGFyYW0oCiAgICBbUGFyYW1ldGVyKCldCiAgICBbc3RyaW5nXSRUYXNrTmFtZSA9ICJCb3JlYWxpcyBBZ2VudCIsCgogICAgW1BhcmFtZXRlcigpXQogICAgW3N0cmluZ10kVGFza1BhdGgKKQoKIyAtLS0gRW52aXJvbm1lbnQtY29udHJvbGxlZCBtb2RlIC0tLQokdXBkYXRlTW9kZSA9ICgkZW52OnVwZGF0ZV9tb2RlKS5Ub0xvd2VySW52YXJpYW50KCkKaWYgKC1ub3QgJHVwZGF0ZU1vZGUpIHsgJHVwZGF0ZU1vZGUgPSAidXBkYXRlIiB9ICAjIGRlZmF1bHQgYmVoYXZpb3IKJGZvcmNlVXBkYXRlID0gJHVwZGF0ZU1vZGUgLWVxICJmb3JjZV91cGRhdGUiCgojIC0tLSBSZXBvc2l0b3J5IGluZm8gKGZpeGVkKSAtLS0KJFJlcG9Pd25lciA9ICJidW5ueS1sYWItaW8iCiRSZXBvTmFtZSAgPSAiQm9yZWFsaXMiCiRCcmFuY2ggICAgPSAibWFpbiIKCiMgcmVnaW9uOiBoZWxwZXIgLSBmZXRjaCBjYWNoZWQgcmVwb3NpdG9yeSBTSEEgZnJvbSBCb3JlYWxpcyBzZXJ2ZXIKZnVuY3Rpb24gR2V0LUJvcmVhbGlzU2VydmVyUmVwb1NoYSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRCYXNlVXJsLAoKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRPd25lciwKCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUmVwbywKCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kQnJhbmNoCiAgICApCgogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJEJhc2VVcmwpKSB7CiAgICAgICAgdGhyb3cgIlNlcnZlciBVUkwgaXMgYmxhbms7IGNhbm5vdCBxdWVyeSByZXBvIGhhc2guIgogICAgfQoKICAgICRiYXNlID0gJEJhc2VVcmwuVHJpbUVuZCgnLycpCiAgICAkcmVwb1BhcmFtID0gW1N5c3RlbS5VcmldOjpFc2NhcGVEYXRhU3RyaW5nKCIkT3duZXIvJFJlcG8iKQogICAgJGJyYW5jaFBhcmFtID0gW1N5c3RlbS5VcmldOjpFc2NhcGVEYXRhU3RyaW5nKCRCcmFuY2gpCiAgICAkdXJpID0gIiRiYXNlL2FwaS9hZ2VudC9yZXBvX2hhc2g/cmVwbz0kcmVwb1BhcmFtJmJyYW5jaD0kYnJhbmNoUGFyYW0iCgogICAgJGhlYWRlcnMgPSBAeyAiVXNlci1BZ2VudCIgPSAiYm9yZWFsaXMtYWdlbnQtdXBkYXRlciIgfQoKICAgICRyZXNwID0gSW52b2tlLVdlYlJlcXVlc3QgLVVyaSAkdXJpIC1NZXRob2QgR0VUIC1IZWFkZXJzICRoZWFkZXJzIC1Vc2VCYXNpY1BhcnNpbmcgLUVycm9yQWN0aW9uIFN0b3AKICAgICRqc29uID0gJHJlc3AuQ29udGVudCB8IENvbnZlcnRGcm9tLUpzb24KCiAgICBpZiAoJHJlc3AuU3RhdHVzQ29kZSAtbmUgMjAwKSB7CiAgICAgICAgJG1lc3NhZ2UgPSAkanNvbi5lcnJvcgogICAgICAgIGlmICgtbm90ICRtZXNzYWdlKSB7ICRtZXNzYWdlID0gIkhUVFAgJCgkcmVzcC5TdGF0dXNDb2RlKSIgfQogICAgICAgIHRocm93ICJCb3JlYWxpcyBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYW4gZXJyb3I6ICRtZXNzYWdlIgogICAgfQoKICAgICRzaGEgPSAoJGpzb24uc2hhKQogICAgaWYgKC1ub3QgJHNoYSkgewogICAgICAgICRtZXNzYWdlID0gJGpzb24uZXJyb3IKICAgICAgICBpZiAoJG1lc3NhZ2UpIHsKICAgICAgICAgICAgdGhyb3cgIkJvcmVhbGlzIHNlcnZlciBkaWQgbm90IHJldHVybiBhIHJlcG9zaXRvcnkgaGFzaDogJG1lc3NhZ2UiCiAgICAgICAgfQogICAgICAgIHRocm93ICJCb3JlYWxpcyBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYSByZXBvc2l0b3J5IGhhc2guIgogICAgfQoKICAgIHJldHVybiAoJHNoYS5Ub1N0cmluZygpKS5UcmltKCkKfQojIGVuZHJlZ2lvbgoKIyAtLS0gTG9jYXRlIEFnZW50IGZvbGRlciB2aWEgc2NoZWR1bGVkIHRhc2sgLS0tCiR0YXNrUGFyYW1zID0gQHsgVGFza05hbWUgPSAkVGFza05hbWU7IEVycm9yQWN0aW9uID0gJ1N0b3AnIH0KaWYgKCRUYXNrUGF0aCkgeyAkdGFza1BhcmFtcy5UYXNrUGF0aCA9ICRUYXNrUGF0aCB9Cgp0cnkgewogICAgJHRhc2sgPSBHZXQtU2NoZWR1bGVkVGFzayBAdGFza1BhcmFtcwp9IGNhdGNoIHsKICAgIHRocm93ICJTY2hlZHVsZWQgdGFzayAnJFRhc2tOYW1lJyB3YXMgbm90IGZvdW5kLiIKfQoKJGV4ZWNBY3Rpb24gPSAkdGFzay5BY3Rpb25zIHwgV2hlcmUtT2JqZWN0IHsgJF8uQ2ltQ2xhc3MuQ2ltQ2xhc3NOYW1lIC1lcSAnTVNGVF9UYXNrRXhlY0FjdGlvbicgfSB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEKaWYgKC1ub3QgJGV4ZWNBY3Rpb24pIHsgdGhyb3cgIlNjaGVkdWxlZCB0YXNrICckVGFza05hbWUnIGRvZXMgbm90IGNvbnRhaW4gYW4gZXhlY3V0YWJsZSBhY3Rpb24uIiB9Cgokd29ya2luZ0RpcmVjdG9yeSA9ICRleGVjQWN0aW9uLldvcmtpbmdEaXJlY3RvcnkKaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHdvcmtpbmdEaXJlY3RvcnkpKSB7CiAgICAkY2FuZGlkYXRlID0gU3BsaXQtUGF0aCAtUGF0aCAkZXhlY0FjdGlvbi5FeGVjdXRlIC1QYXJlbnQKICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRjYW5kaWRhdGUpKSB7CiAgICAgICAgdGhyb3cgIlVuYWJsZSB0byBkZXRlcm1pbmUgd29ya2luZyBkaXJlY3RvcnkgZm9yICckVGFza05hbWUnLiIKICAgIH0KICAgICR3b3JraW5nRGlyZWN0b3J5ID0gJGNhbmRpZGF0ZQp9Cgp0cnkgewogICAgJGFnZW50Um9vdCA9IFJlc29sdmUtUGF0aCAtUGF0aCAkd29ya2luZ0RpcmVjdG9yeSAtRXJyb3JBY3Rpb24gU3RvcAp9IGNhdGNoIHsKICAgIHRocm93ICJUaGUgd29ya2luZyBkaXJlY3RvcnkgJyR3b3JraW5nRGlyZWN0b3J5JyBkb2VzIG5vdCBleGlzdC4iCn0KCnRyeSB7CiAgICAkcmVwb1Jvb3QgPSBSZXNvbHZlLVBhdGggLVBhdGggKEpvaW4tUGF0aCAkYWdlbnRSb290ICcuLlwuLicpIC1FcnJvckFjdGlvbiBTdG9wCn0gY2F0Y2ggewogICAgdGhyb3cgIlVuYWJsZSB0byByZXNvbHZlIEJvcmVhbGlzIHJlcG9zaXRvcnkgcm9vdCBmcm9tICckYWdlbnRSb290Jy4iCn0KCiR1cGRhdGVTY3JpcHQgPSBKb2luLVBhdGggJHJlcG9Sb290ICdCb3JlYWxpcy5wczEnCmlmICgtbm90IChUZXN0LVBhdGggJHVwZGF0ZVNjcmlwdCAtUGF0aFR5cGUgTGVhZikpIHsKICAgIHRocm93ICJCb3JlYWxpcy5wczEgbm90IGZvdW5kIGF0ICckdXBkYXRlU2NyaXB0Jy4iCn0KCldyaXRlLVZlcmJvc2UgIkFnZW50IHJvb3Q6ICRhZ2VudFJvb3QiCldyaXRlLVZlcmJvc2UgIlJlcG8gcm9vdDogJHJlcG9Sb290IgoKIyAtLS0gRGV0ZXJtaW5lIEJvcmVhbGlzIHNlcnZlciBVUkwgLS0tCiRzZXJ2ZXJCYXNlVXJsID0gJGVudjpCT1JFQUxJU19TRVJWRVJfVVJMCmlmICgtbm90ICRzZXJ2ZXJCYXNlVXJsKSB7CiAgICAkc2V0dGluZ3NEaXIgPSBKb2luLVBhdGggJGFnZW50Um9vdCAnU2V0dGluZ3MnCiAgICAkc2VydmVyVXJsRmlsZSA9IEpvaW4tUGF0aCAkc2V0dGluZ3NEaXIgJ3NlcnZlcl91cmwudHh0JwogICAgaWYgKFRlc3QtUGF0aCAkc2VydmVyVXJsRmlsZSkgewogICAgICAgICRzZXJ2ZXJCYXNlVXJsID0gKEdldC1Db250ZW50ICRzZXJ2ZXJVcmxGaWxlIC1SYXcpLlRyaW0oKQogICAgfQp9CmlmICgtbm90ICRzZXJ2ZXJCYXNlVXJsKSB7ICRzZXJ2ZXJCYXNlVXJsID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTAwMCcgfQokc2VydmVyQmFzZVVybCA9ICRzZXJ2ZXJCYXNlVXJsLlRyaW0oKQpXcml0ZS1WZXJib3NlICJVc2luZyBCb3JlYWxpcyBzZXJ2ZXIgVVJMOiAkc2VydmVyQmFzZVVybCIKCiMgLS0tIFNpbmdsZS1maWxlIFNIQSBzdGF0ZSBhdCBhZ2VudCByb290IC0tLQokaGFzaEZpbGUgPSBKb2luLVBhdGggJGFnZW50Um9vdCAnZ2l0aHViX3JlcG9faGFzaC50eHQnCgojIC0tLSBMb2FkIGxhc3Qta25vd24gU0hBIChQUyA1LjEgc2FmZSkgLS0tCiRsYXN0U2hhID0gJG51bGwKaWYgKFRlc3QtUGF0aCAkaGFzaEZpbGUpIHsKICAgICRsYXN0U2hhID0gKEdldC1Db250ZW50ICRoYXNoRmlsZSAtUmF3KS5UcmltKCkKfQoKIyAtLS0gUXVlcnkgQm9yZWFsaXMgc2VydmVyIGZvciBjdXJyZW50IFNIQSAtLS0KJG5ld1NoYSA9ICRudWxsCnRyeSB7CiAgICAkbmV3U2hhID0gR2V0LUJvcmVhbGlzU2VydmVyUmVwb1NoYSAtQmFzZVVybCAkc2VydmVyQmFzZVVybCAtT3duZXIgJFJlcG9Pd25lciAtUmVwbyAkUmVwb05hbWUgLUJyYW5jaCAkQnJhbmNoCn0gY2F0Y2ggewogICAgdGhyb3cgIkZhaWxlZCB0byBxdWVyeSBCb3JlYWxpcyBzZXJ2ZXIgZm9yIGxhdGVzdCBTSEE6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIgp9CgojIC0tLSBEZXRlcm1pbmUgY2hhbmdlIC0tLQokY2hhbmdlRGV0ZWN0ZWQgPSAkZmFsc2UKaWYgKC1ub3QgJGxhc3RTaGEpIHsKICAgIFdyaXRlLVZlcmJvc2UgIk5vIHByaW9yIFNIQSBvbiBkaXNrOyB0cmVhdGluZyBhcyBmaXJzdCBydW4uIgogICAgJGNoYW5nZURldGVjdGVkID0gJHRydWUKfSBlbHNlaWYgKCRsYXN0U2hhIC1uZSAkbmV3U2hhKSB7CiAgICAkY2hhbmdlRGV0ZWN0ZWQgPSAkdHJ1ZQogICAgV3JpdGUtVmVyYm9zZSAiUmVwbyB1cGRhdGVkOiAkbGFzdFNoYSAtPiAkbmV3U2hhIgp9IGVsc2UgewogICAgV3JpdGUtVmVyYm9zZSAiU0hBIHVuY2hhbmdlZDogJG5ld1NoYSIKfQoKIyAtLS0gRGVjaWRlIGlmIHVwZGF0ZSBzaG91bGQgcnVuIC0tLQokc2hvdWxkVXBkYXRlID0gJGZhbHNlCmlmICgkZm9yY2VVcGRhdGUpIHsKICAgIFdyaXRlLVZlcmJvc2UgInVwZGF0ZV9tb2RlPWZvcmNlX3VwZGF0ZSDihpIgZm9yY2luZyB1cGRhdGUuIgogICAgJHNob3VsZFVwZGF0ZSA9ICR0cnVlCn0gZWxzZWlmICgkY2hhbmdlRGV0ZWN0ZWQpIHsKICAgIFdyaXRlLVZlcmJvc2UgInVwZGF0ZV9tb2RlPXVwZGF0ZSDihpIgcmVwbyBjaGFuZ2VkIG9yIGZpcnN0IHJ1bi4iCiAgICAkc2hvdWxkVXBkYXRlID0gJHRydWUKfSBlbHNlIHsKICAgIFdyaXRlLVZlcmJvc2UgIk5vIGNoYW5nZTsgc2tpcHBpbmcgQm9yZWFsaXMucHMxIC1TaWxlbnRVcGRhdGUuIgp9CgppZiAoLW5vdCAkc2hvdWxkVXBkYXRlKSB7CiAgICBXcml0ZS1Ib3N0ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgV3JpdGUtSG9zdCAiQm9yZWFsaXMgQWdlbnQgQWxyZWFkeSBVcC10by1EYXRlIgogICAgV3JpdGUtSG9zdCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKICAgIHJldHVybgp9CgojIC0tLSBTSU5HTEVUT04gTVVURVg6IHByZXZlbnQgY29uY3VycmVudCB1cGRhdGVycyBmcm9tIHN0b21waW5nIHRoZSBzYW1lIHppcCAtLS0KJG11dGV4ID0gJG51bGwKJGdvdE11dGV4ID0gJGZhbHNlCnRyeSB7CiAgICAkbXV0ZXggPSBOZXctT2JqZWN0IFN5c3RlbS5UaHJlYWRpbmcuTXV0ZXgoJGZhbHNlLCAiR2xvYmFsXEJvcmVhbGlzVXBkYXRlIikKICAgICRnb3RNdXRleCA9ICRtdXRleC5XYWl0T25lKDApCiAgICBpZiAoLW5vdCAkZ290TXV0ZXgpIHsKICAgICAgICBXcml0ZS1WZXJib3NlICJBbm90aGVyIHVwZGF0ZSBpcyBhbHJlYWR5IHJ1bm5pbmcgKG11dGV4IGhlbGQpLiBFeGl0aW5nIHF1aWV0bHkuIgogICAgICAgIFdyaXRlLUhvc3QgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCiAgICAgICAgV3JpdGUtSG9zdCAiQm9yZWFsaXMgQWdlbnQgQWxyZWFkeSBVcC10by1EYXRlIgogICAgICAgIFdyaXRlLUhvc3QgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgIyAtLS0gUFJFLUZMSUdIVDogcHVyZ2Ugc3RhbGUgJ21haW4uemlwJyB3aXRoIHJldHJpZXMgdG8gYXZvaWQgJ2luIHVzZScgZXJyb3JzIC0tLQogICAgJHN0YWdpbmcgPSBKb2luLVBhdGggJHJlcG9Sb290ICdVcGRhdGVfU3RhZ2luZycKICAgICR6aXBQYXRoID0gSm9pbi1QYXRoICRzdGFnaW5nICdtYWluLnppcCcKICAgIGlmIChUZXN0LVBhdGggJHppcFBhdGgpIHsKICAgICAgICBXcml0ZS1WZXJib3NlICJQcmUtZmxpZ2h0OiByZW1vdmluZyBleGlzdGluZyAkemlwUGF0aCIKICAgICAgICBmb3IgKCRpPTE7ICRpIC1sZSAxMDsgJGkrKykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICR6aXBQYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU3RvcAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICBTdGFydC1TbGVlcCAtTWlsbGlzZWNvbmRzICgxMDAgKiAkaSkgICMgYmFja29mZjogMTAwLi4xMDAwbXMKICAgICAgICAgICAgICAgIGlmICgkaSAtZXEgMTApIHsgdGhyb3cgIlByZS1mbGlnaHQgZGVsZXRlIGZhaWxlZDsgJHppcFBhdGggYXBwZWFycyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLiIgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgT3B0aW9uYWw6IGdpdmUgY2hpbGQgc2NyaXB0IHRoZSBTSEE7IEJvcmVhbGlzLnBzMSBjYW4gY2hvb3NlIHRvIG5hbWUgdW5pcXVlIGFyY2hpdmVzIGlmIGRlc2lyZWQKICAgICRlbnY6Qk9SRUFMSVNfRVhQRUNURURfU0hBID0gJG5ld1NoYQoKICAgICMgLS0tIFBlcmZvcm0gdXBkYXRlIC0tLQogICAgV3JpdGUtVmVyYm9zZSAiSW52b2tpbmcgQm9yZWFsaXMucHMxIC1TaWxlbnRVcGRhdGUuLi4iCiAgICBQdXNoLUxvY2F0aW9uICRyZXBvUm9vdAogICAgJHVwZGF0ZVN1Y2NlZWRlZCA9ICRmYWxzZQogICAgdHJ5IHsKICAgICAgICAmICR1cGRhdGVTY3JpcHQgLVNpbGVudFVwZGF0ZQogICAgICAgICR1cGRhdGVTdWNjZWVkZWQgPSAkPwogICAgfSBmaW5hbGx5IHsKICAgICAgICBQb3AtTG9jYXRpb24KICAgIH0KCiAgICBpZiAoLW5vdCAkdXBkYXRlU3VjY2VlZGVkKSB7CiAgICAgICAgdGhyb3cgIkJvcmVhbGlzLnBzMSAtU2lsZW50VXBkYXRlIGZhaWxlZDsgbm90IGFkdmFuY2luZyBzdG9yZWQgU0hBLiIKICAgIH0KCiAgICAjIC0tLSBTYXZlIG5ldyBTSEEgb25seSBhZnRlciBzdWNjZXNzIC0tLQogICAgaWYgKCRuZXdTaGEpIHsKICAgICAgICBTZXQtQ29udGVudCAtUGF0aCAkaGFzaEZpbGUgLVZhbHVlICRuZXdTaGEgLUVuY29kaW5nIEFTQ0lJCiAgICB9CgogICAgV3JpdGUtSG9zdCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKICAgIFdyaXRlLUhvc3QgKCJCb3JlYWxpcyBBZ2VudCBVcGRhdGVkIC0gTmV3IEdpdGh1YiBSZXBvc2l0b3J5IEhhc2g6IHswfSIgLWYgJG5ld1NoYSkKICAgIFdyaXRlLUhvc3QgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCn0KZmluYWxseSB7CiAgICBpZiAoJG11dGV4IC1hbmQgJGdvdE11dGV4KSB7ICRtdXRleC5SZWxlYXNlTXV0ZXgoKSB8IE91dC1OdWxsIH0KICAgIGlmICgkbXV0ZXgpIHsgJG11dGV4LkRpc3Bvc2UoKSB9Cn0K", + "script": "W0NtZGxldEJpbmRpbmcoKV0KcGFyYW0oCiAgICBbUGFyYW1ldGVyKCldCiAgICBbc3RyaW5nXSRUYXNrTmFtZSA9ICJCb3JlYWxpcyBBZ2VudCIsCgogICAgW1BhcmFtZXRlcigpXQogICAgW3N0cmluZ10kVGFza1BhdGgKKQoKJHRhc2tQYXJhbXMgPSBAeyBUYXNrTmFtZSA9ICRUYXNrTmFtZTsgRXJyb3JBY3Rpb24gPSAnU3RvcCcgfQppZiAoJFRhc2tQYXRoKSB7ICR0YXNrUGFyYW1zLlRhc2tQYXRoID0gJFRhc2tQYXRoIH0KCnRyeSB7CiAgICAkdGFzayA9IEdldC1TY2hlZHVsZWRUYXNrIEB0YXNrUGFyYW1zCn0gY2F0Y2ggewogICAgdGhyb3cgIlNjaGVkdWxlZCB0YXNrICckVGFza05hbWUnIHdhcyBub3QgZm91bmQuIgp9CgokZXhlY0FjdGlvbiA9ICR0YXNrLkFjdGlvbnMgfCBXaGVyZS1PYmplY3QgeyAkXy5DaW1DbGFzcy5DaW1DbGFzc05hbWUgLWVxICdNU0ZUX1Rhc2tFeGVjQWN0aW9uJyB9IHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMQppZiAoLW5vdCAkZXhlY0FjdGlvbikgeyB0aHJvdyAiU2NoZWR1bGVkIHRhc2sgJyRUYXNrTmFtZScgZG9lcyBub3QgY29udGFpbiBhbiBleGVjdXRhYmxlIGFjdGlvbi4iIH0KCiR3b3JraW5nRGlyZWN0b3J5ID0gJGV4ZWNBY3Rpb24uV29ya2luZ0RpcmVjdG9yeQppZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkd29ya2luZ0RpcmVjdG9yeSkpIHsKICAgICRjYW5kaWRhdGUgPSBTcGxpdC1QYXRoIC1QYXRoICRleGVjQWN0aW9uLkV4ZWN1dGUgLVBhcmVudAogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGNhbmRpZGF0ZSkpIHsKICAgICAgICB0aHJvdyAiVW5hYmxlIHRvIGRldGVybWluZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgJyRUYXNrTmFtZScuIgogICAgfQogICAgJHdvcmtpbmdEaXJlY3RvcnkgPSAkY2FuZGlkYXRlCn0KCnRyeSB7CiAgICAkYWdlbnRSb290ID0gUmVzb2x2ZS1QYXRoIC1QYXRoICR3b3JraW5nRGlyZWN0b3J5IC1FcnJvckFjdGlvbiBTdG9wCn0gY2F0Y2ggewogICAgdGhyb3cgIlRoZSB3b3JraW5nIGRpcmVjdG9yeSAnJHdvcmtpbmdEaXJlY3RvcnknIGRvZXMgbm90IGV4aXN0LiIKfQoKdHJ5IHsKICAgICRyZXBvUm9vdCA9IFJlc29sdmUtUGF0aCAtUGF0aCAoSm9pbi1QYXRoICRhZ2VudFJvb3QgJy4uXC4uJykgLUVycm9yQWN0aW9uIFN0b3AKfSBjYXRjaCB7CiAgICB0aHJvdyAiVW5hYmxlIHRvIHJlc29sdmUgQm9yZWFsaXMgcmVwb3NpdG9yeSByb290IGZyb20gJyRhZ2VudFJvb3QnLiIKfQoKJHVwZGF0ZVNjcmlwdCA9IEpvaW4tUGF0aCAkcmVwb1Jvb3QgJ0JvcmVhbGlzLnBzMScKaWYgKC1ub3QgKFRlc3QtUGF0aCAkdXBkYXRlU2NyaXB0IC1QYXRoVHlwZSBMZWFmKSkgewogICAgdGhyb3cgIkJvcmVhbGlzLnBzMSBub3QgZm91bmQgYXQgJyR1cGRhdGVTY3JpcHQnLiIKfQoKV3JpdGUtVmVyYm9zZSAiQWdlbnQgcm9vdDogJGFnZW50Um9vdCIKV3JpdGUtVmVyYm9zZSAiUmVwbyByb290OiAkcmVwb1Jvb3QiCldyaXRlLVZlcmJvc2UgIkludm9raW5nIEJvcmVhbGlzLnBzMSAtU2lsZW50VXBkYXRlLi4uIgoKUHVzaC1Mb2NhdGlvbiAkcmVwb1Jvb3QKJHVwZGF0ZVN1Y2NlZWRlZCA9ICRmYWxzZQp0cnkgewogICAgJiAkdXBkYXRlU2NyaXB0IC1TaWxlbnRVcGRhdGUKICAgICR1cGRhdGVTdWNjZWVkZWQgPSAkPwp9IGZpbmFsbHkgewogICAgUG9wLUxvY2F0aW9uCn0KCmlmICgtbm90ICR1cGRhdGVTdWNjZWVkZWQpIHsKICAgIHRocm93ICdCb3JlYWxpcy5wczEgLVNpbGVudFVwZGF0ZSBmYWlsZWQuJwp9", "timeout_seconds": 3600, "sites": { "mode": "all", diff --git a/Borealis.ps1 b/Borealis.ps1 index f5dba24..ddc036f 100644 --- a/Borealis.ps1 +++ b/Borealis.ps1 @@ -633,6 +633,153 @@ function Start-AgentScheduledTasks { } } +$BorealisRepoOwner = 'bunny-lab-io' +$BorealisRepoName = 'Borealis' +$BorealisRepoBranch = 'main' + +function Get-BorealisServerRepoSha { + param( + [Parameter(Mandatory = $true)] + [string]$BaseUrl, + + [Parameter(Mandatory = $true)] + [string]$Owner, + + [Parameter(Mandatory = $true)] + [string]$Repo, + + [Parameter(Mandatory = $true)] + [string]$Branch + ) + + if ([string]::IsNullOrWhiteSpace($BaseUrl)) { + throw 'Server URL is blank; cannot query repo hash.' + } + + $base = $BaseUrl.TrimEnd('/') + $repoParam = [System.Uri]::EscapeDataString("$Owner/$Repo") + $branchParam = [System.Uri]::EscapeDataString($Branch) + $uri = "$base/api/agent/repo_hash?repo=$repoParam&branch=$branchParam" + + $headers = @{ 'User-Agent' = 'borealis-agent-updater' } + + $resp = Invoke-WebRequest -Uri $uri -Method GET -Headers $headers -UseBasicParsing -ErrorAction Stop + $json = $resp.Content | ConvertFrom-Json + + if ($resp.StatusCode -ne 200) { + $message = $json.error + if (-not $message) { $message = "HTTP $($resp.StatusCode)" } + throw "Borealis server responded with an error: $message" + } + + $sha = ($json.sha) + if (-not $sha) { + $message = $json.error + if ($message) { + throw "Borealis server did not return a repository hash: $message" + } + throw 'Borealis server did not return a repository hash.' + } + + return ($sha.ToString()).Trim() +} + +function Get-BorealisUpdatePlan { + param( + [Parameter(Mandatory = $true)] + [string]$ScriptDirectory, + + [Parameter(Mandatory = $true)] + [string]$RepoOwner, + + [Parameter(Mandatory = $true)] + [string]$RepoName, + + [Parameter(Mandatory = $true)] + [string]$Branch + ) + + if ([string]::IsNullOrWhiteSpace($ScriptDirectory)) { + throw 'Script directory was not provided.' + } + + $updateMode = $env:update_mode + if ($updateMode) { + $updateMode = $updateMode.ToLowerInvariant() + } else { + $updateMode = 'update' + } + $forceUpdate = $updateMode -eq 'force_update' + + $agentRootCandidate = Join-Path $ScriptDirectory 'Agent\Borealis' + $agentRoot = $ScriptDirectory + if (Test-Path $agentRootCandidate -PathType Container) { + try { + $agentRoot = (Resolve-Path -Path $agentRootCandidate -ErrorAction Stop).Path + } catch { + $agentRoot = $agentRootCandidate + } + } + + $hashFile = Join-Path $agentRoot 'github_repo_hash.txt' + $lastSha = $null + if (Test-Path $hashFile -PathType Leaf) { + $lastSha = (Get-Content $hashFile -Raw).Trim() + } + + $serverBaseUrl = $env:BOREALIS_SERVER_URL + if (-not $serverBaseUrl) { + $settingsDir = Join-Path $agentRoot 'Settings' + $serverUrlFile = Join-Path $settingsDir 'server_url.txt' + if (Test-Path $serverUrlFile -PathType Leaf) { + $serverBaseUrl = (Get-Content $serverUrlFile -Raw).Trim() + } + } + if (-not $serverBaseUrl) { $serverBaseUrl = 'http://localhost:5000' } + $serverBaseUrl = $serverBaseUrl.Trim() + Write-Verbose "Using Borealis server URL: $serverBaseUrl" + + try { + $newSha = Get-BorealisServerRepoSha -BaseUrl $serverBaseUrl -Owner $RepoOwner -Repo $RepoName -Branch $Branch + } catch { + throw "Failed to query Borealis server for latest SHA: $($_.Exception.Message)" + } + + $changeDetected = $false + if (-not $lastSha) { + Write-Verbose 'No prior SHA on disk; treating as first run.' + $changeDetected = $true + } elseif ($lastSha -ne $newSha) { + $changeDetected = $true + Write-Verbose "Repo updated: $lastSha -> $newSha" + } else { + Write-Verbose "SHA unchanged: $newSha" + } + + $shouldUpdate = $false + if ($forceUpdate) { + Write-Verbose 'update_mode=force_update → forcing update.' + $shouldUpdate = $true + } elseif ($changeDetected) { + Write-Verbose 'update_mode=update → repo changed or first run.' + $shouldUpdate = $true + } else { + Write-Verbose 'No change; skipping Borealis.ps1 -SilentUpdate.' + } + + return [pscustomobject]@{ + ShouldUpdate = $shouldUpdate + ForceUpdate = $forceUpdate + ChangeDetected = $changeDetected + LastSha = $lastSha + NewSha = $newSha + HashFile = $hashFile + AgentRoot = $agentRoot + ServerBaseUrl = $serverBaseUrl + UpdateMode = $updateMode + } +} + function Invoke-BorealisUpdate { param( [switch]$Silent @@ -702,13 +849,85 @@ function Invoke-BorealisUpdate { function Invoke-BorealisSilentUpdate { Write-Host "Initiating Borealis silent update workflow..." -ForegroundColor DarkCyan - $managedTasks = Stop-AgentScheduledTasks -TaskNames @('Borealis Agent','Borealis Agent (UserHelper)') + + $plan = Get-BorealisUpdatePlan -ScriptDirectory $scriptDir -RepoOwner $BorealisRepoOwner -RepoName $BorealisRepoName -Branch $BorealisRepoBranch + + if (-not $plan.ShouldUpdate) { + Write-Host "==============================================" + Write-Host "Borealis Agent Already Up-to-Date" + Write-Host "==============================================" + return + } + + $mutex = $null + $gotMutex = $false + $managedTasks = @() try { - Invoke-BorealisUpdate -Silent - } finally { - if ($managedTasks.Count -gt 0) { - Start-AgentScheduledTasks -TaskNames $managedTasks + $mutex = New-Object System.Threading.Mutex($false, 'Global\BorealisUpdate') + $gotMutex = $mutex.WaitOne(0) + if (-not $gotMutex) { + Write-Verbose 'Another update is already running (mutex held). Exiting quietly.' + Write-Host "==============================================" + Write-Host "Borealis Agent Already Up-to-Date" + Write-Host "==============================================" + return } + + $staging = Join-Path $scriptDir 'Update_Staging' + $zipPath = Join-Path $staging 'main.zip' + if (Test-Path $zipPath) { + Write-Verbose "Pre-flight: removing existing $zipPath" + for ($i = 1; $i -le 10; $i++) { + try { + Remove-Item -LiteralPath $zipPath -Force -ErrorAction Stop + break + } catch { + Start-Sleep -Milliseconds (100 * $i) + if ($i -eq 10) { + throw "Pre-flight delete failed; $zipPath appears locked by another process." + } + } + } + } + + $managedTasks = Stop-AgentScheduledTasks -TaskNames @('Borealis Agent','Borealis Agent (UserHelper)') + + $updateSucceeded = $false + try { + if ($plan.NewSha) { + $env:BOREALIS_EXPECTED_SHA = $plan.NewSha + } + + Invoke-BorealisUpdate -Silent + $updateSucceeded = $true + } finally { + if ($plan.NewSha) { + Remove-Item Env:BOREALIS_EXPECTED_SHA -ErrorAction SilentlyContinue + } + + if ($managedTasks.Count -gt 0) { + Start-AgentScheduledTasks -TaskNames $managedTasks + } + } + + if (-not $updateSucceeded) { + throw 'Borealis.ps1 -SilentUpdate failed; not advancing stored SHA.' + } + + if ($plan.NewSha) { + $hashDir = Split-Path $plan.HashFile -Parent + if ($hashDir -and -not (Test-Path $hashDir -PathType Container)) { + New-Item -ItemType Directory -Path $hashDir -Force | Out-Null + } + Set-Content -Path $plan.HashFile -Value $plan.NewSha -Encoding ASCII + } + + Write-Host "==============================================" + Write-Host ("Borealis Agent Updated - New Github Repository Hash: {0}" -f $plan.NewSha) + Write-Host "==============================================" + } finally { + if ($mutex -and $gotMutex) { $mutex.ReleaseMutex() | Out-Null } + if ($mutex) { $mutex.Dispose() } } }