Skip to content

Commit 46e3a77

Browse files
committed
use proper JSON serialization, update tests and README
Replace manual JSON string construction with Hash body (letting Faraday's JSON middleware handle serialization). Update specs to match current POST-based API. Overhaul README with screenshots, architecture diagram and troubleshooting section.
1 parent b525088 commit 46e3a77

4 files changed

Lines changed: 185 additions & 70 deletions

File tree

README.md

Lines changed: 137 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,151 @@
1-
<img src="https://www.seven.io/wp-content/uploads/Logo.svg" width="250" />
1+
<p align="center">
2+
<img src="https://www.seven.io/wp-content/uploads/Logo.svg" width="250" alt="seven logo" />
3+
</p>
24

5+
<h1 align="center">seven SMS for Zammad</h1>
36

4-
# Zammad Package for seven.io
5-
This package adds seven as a SMS provider for two-way messaging.
7+
<p align="center">
8+
Two-way SMS messaging for Zammad via the seven gateway.
9+
</p>
610

7-
Tested with Zammad v6.x.
11+
<p align="center">
12+
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-teal.svg" alt="MIT License" /></a>
13+
<img src="https://img.shields.io/badge/Zammad-v6.x-blue" alt="Zammad v6.x" />
14+
<img src="https://img.shields.io/badge/version-2.3.0-green" alt="Version 2.3.0" />
15+
</p>
16+
17+
---
18+
19+
## Features
20+
21+
- **Outbound SMS** &mdash; Send SMS notifications directly from Zammad tickets
22+
- **Inbound SMS** &mdash; Receive SMS and automatically create or update tickets
23+
- **Custom Sender ID** &mdash; Configure a sender name or number for outbound messages
24+
25+
## How it works
26+
27+
```
28+
┌─────────────┐
29+
│ Zammad │
30+
│ Ticket │
31+
└──────┬──────┘
32+
33+
┌────────────────┼────────────────┐
34+
│ │ │
35+
▼ ▼ ▼
36+
┌───────────┐ ┌────────────┐ ┌────────────────┐
37+
│ Outbound │ │ Inbound │ │ Notification │
38+
│ (Reply) │ │ (Webhook) │ │ (Trigger) │
39+
└─────┬─────┘ └─────┬──────┘ └───────┬────────┘
40+
│ │ │
41+
▼ ▼ ▼
42+
┌─────────────────────────────────────────────┐
43+
│ seven SMS Gateway API │
44+
│ gateway.seven.io/api/sms │
45+
└──────────────────┬──────────────────────────┘
46+
47+
48+
┌───────────┐
49+
│ Customer │
50+
│ Phone │
51+
└───────────┘
52+
```
53+
54+
## Prerequisites
55+
56+
- Zammad v6.x (self-hosted)
57+
- A [seven account](https://www.seven.io/) with API key ([How to get your API key](https://help.seven.io/en/api-key-access))
858

959
## Installation
10-
1. Download **seven-sms.szpm** file from [Latest Releases](https://github.com/seven-io/zammad/releases/latest "Latest Releases")
11-
2. Open up your Zammad **Dashboard**
12-
3. Click on **Admin**, navigate to **Manage->System->Packages** and press **Choose File**
13-
4. Locate the downloaded **seven-sms.szpm** and click **Install Package**
14-
5. Execute as *zammad* user: `zammad run rake zammad:package:migrate && zammad run rake assets:precompile && systemctl restart zammad`
15-
6. Go to **Manage->Channels->SMS->SMS Notification** and choose **seven**
16-
7. Type in your [API Key](https://help.seven.io/en/api-key-access), test and you are ready to go
60+
61+
### Step 1: Upload the package
62+
63+
Download **seven-sms.szpm** from the [latest release](https://github.com/seven-io/zammad/releases/latest).
64+
65+
In Zammad, navigate to **Admin > System > Packages**, click **Choose File** and select the downloaded `.szpm` file, then click **Install Package**.
66+
67+
<details>
68+
<summary>Screenshot: Package Management</summary>
69+
70+
![Package Management](screenshots/1_install_pkg_mgmt.png)
71+
</details>
72+
73+
<details>
74+
<summary>Screenshot: Package installed</summary>
75+
76+
![Package installed](screenshots/2_post_install.png)
77+
</details>
78+
79+
### Step 2: Finalize installation
80+
81+
> **Important:** This step is required! Without it, the plugin will not appear in the SMS provider selection.
82+
83+
Run these commands on your Zammad server as the *zammad* user:
84+
85+
```bash
86+
zammad run rake zammad:package:migrate
87+
zammad run rake assets:precompile
88+
systemctl restart zammad
89+
```
90+
91+
### Step 3: Configure SMS Notification
92+
93+
Navigate to **Channels > SMS** and click **New** under *SMS Notification*. Select **seven** as the provider, enter your API key and optionally set a sender ID.
94+
95+
<details>
96+
<summary>Screenshot: SMS Channel overview</summary>
97+
98+
![SMS Channels](screenshots/3_channels_sms.png)
99+
</details>
100+
101+
<details>
102+
<summary>Screenshot: Configure SMS Notification</summary>
103+
104+
![SMS Notification](screenshots/4_sms_notification.png)
105+
</details>
106+
107+
### Step 4: Test
108+
109+
Click **Test** to verify the connection. You should see a "SMS successfully sent" confirmation.
110+
111+
<details>
112+
<summary>Screenshot: Test SMS provider</summary>
113+
114+
![Test SMS](screenshots/5_test_sms_provider.png)
115+
</details>
116+
117+
<details>
118+
<summary>Screenshot: Success</summary>
119+
120+
![SMS sent](screenshots/6_post_test_sms_provider.png)
121+
</details>
122+
123+
<details>
124+
<summary>Screenshot: Final result</summary>
125+
126+
![Configured](screenshots/7_sms_channels.png)
127+
</details>
128+
129+
## Inbound SMS (Webhook)
130+
131+
To receive incoming SMS as Zammad tickets:
132+
133+
1. Set up a [webhook at seven](https://help.seven.io/en/articles/9582203-how-do-i-receive-sms) &mdash; make sure the format is set to **JSON**
134+
2. Point the webhook URL to your Zammad instance
135+
3. Incoming SMS will automatically create new tickets or append to existing conversations
17136

18137
## Usage
19138

20-
Please refer to the official [documentation](https://admin-docs.zammad.org/en/6.1/channels/sms.html) over at Zammad.
139+
For general SMS usage in Zammad, refer to the official [Zammad SMS documentation](https://admin-docs.zammad.org/en/6.1/channels/sms.html).
21140

22-
### Inbound messages
23-
When [setting up a webhook](https://help.seven.io/en/articles/9582203-how-do-i-receive-sms) at seven, make sure that it is of type `JSON`.
141+
## Troubleshooting
24142

143+
| Problem | Solution |
144+
|---|---|
145+
| Plugin not visible after install | Run the post-install commands from Step 2 and restart Zammad |
146+
| SMS sending fails | Check your API key in the seven [dashboard](https://app.seven.io/) and verify your account balance |
147+
| Inbound SMS not creating tickets | Ensure the webhook at seven is set to type **JSON** and the URL is reachable |
25148

26149
## Support
27150

28151
Need help? Feel free to [contact us](https://www.seven.io/en/company/contact/).
29-
30-
[![MIT](https://img.shields.io/badge/License-MIT-teal.svg)](LICENSE)

app/models/channel/driver/sms/seven.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def deliver(options, attr, _notification = false)
3131
req.headers['Content-Type'] = 'application/json'
3232
req.headers['SentWith'] = 'zammad'
3333
req.headers['X-Api-Key'] = options[:api_key]
34-
req.body = "{ \"text\": \"#{attr[:message]}\", \"to\": \"#{attr[:recipient]}\", \"from\": \"#{options[:from]}\" }"
34+
req.body = { text: attr[:message], to: attr[:recipient], from: options[:from] }
3535
end
3636

3737
response = data.body['success']

seven-sms.szpm

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
{
22
"name": "seven SMS",
3-
"version": "2.2.1",
3+
"version": "2.3.0",
44
"vendor": "seven communications GmbH & Co. KG",
55
"license": "MIT",
66
"url": "https://www.seven.io/",
77
"buildhost": "localhost",
8-
"builddate": "2025-28-03 00:00:00 UTC",
8+
"builddate": "2026-20-02 00:00:00 UTC",
99
"change_log": [
10+
{
11+
"version": "2.3.0",
12+
"date": "2026-20-02 00:00:00 UTC",
13+
"log": "use proper JSON serialization for request body, update tests"
14+
},
1015
{
1116
"version": "2.2.1",
1217
"date": "2025-28-03 00:00:00 UTC",
@@ -54,7 +59,7 @@
5459
"location": "app/models/channel/driver/sms/seven.rb",
5560
"permission": 644,
5661
"encode": "base64",
57-
"content": "Y2xhc3MgQ2hhbm5lbDo6RHJpdmVyOjpTbXM6OlNldmVuIDwgQ2hhbm5lbDo6RHJpdmVyOjpTbXM6OkJhc2UNCiAgTkFNRSA9ICdzbXMvc2V2ZW4nLmZyZWV6ZQ0KDQogIGRlZiBmZXRjaGFibGU/KF9jaGFubmVsKQ0KICAgIGZhbHNlDQogIGVuZA0KDQogIGRlZiBkZWxpdmVyKG9wdGlvbnMsIGF0dHIsIF9ub3RpZmljYXRpb24gPSBmYWxzZSkNCiAgICBSYWlscy5sb2dnZXIuaW5mbyAiU2VuZGluZyBTTVMgdG8gcmVjaXBpZW50ICN7YXR0cls6cmVjaXBpZW50XX0iDQoNCiAgICBpZiBTZXR0aW5nLmdldCgnaW1wb3J0X21vZGUnKQ0KICAgICAgUmFpbHMubG9nZ2VyLmluZm8gIkFib3J0aW5nIHNldmVuIFNNUyB0byAje2F0dHJbOnJlY2lwaWVudF19IGJlY2F1c2UgaW1wb3J0IG1vZGUgaXMgZW5hYmxlZCINCiAgICAgIHJldHVybiB0cnVlDQogICAgZW5kDQoNCiAgICBpZiBTZXR0aW5nLmdldCgnZGV2ZWxvcGVyX21vZGUnKQ0KICAgICAgUmFpbHMubG9nZ2VyLmluZm8gIkFib3J0aW5nIHNldmVuIFNNUyB0byAje2F0dHJbOnJlY2lwaWVudF19IGJlY2F1c2UgZGV2ZWxvcGVyIG1vZGUgaXMgZW5hYmxlZCINCiAgICAgIHJldHVybiB0cnVlDQogICAgZW5kDQoNCiAgICBSYWlscy5sb2dnZXIuaW5mbyAiQmFja2VuZCBzZW5kaW5nIHNldmVuIFNNUyB0byAje2F0dHJbOnJlY2lwaWVudF19Ig0KDQogICAgYmVnaW4NCiAgICAgIGNvbm4gPSBGYXJhZGF5Lm5ldyBkbyB8ZnwNCiAgICAgICAgZi5yZXF1ZXN0IDpqc29uDQogICAgICAgIGYucmVzcG9uc2UgOmpzb24NCiAgICAgIGVuZA0KICAgICAgZGF0YSA9IGNvbm4ucG9zdCBkbyB8cmVxfA0KICAgICAgICByZXEudXJsICdodHRwczovL2dhdGV3YXkuc2V2ZW4uaW8vYXBpL3NtcycNCiAgICAgICAgcmVxLmhlYWRlcnNbJ0FjY2VwdCddID0gJ2FwcGxpY2F0aW9uL2pzb24nDQogICAgICAgIHJlcS5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJw0KICAgICAgICByZXEuaGVhZGVyc1snU2VudFdpdGgnXSA9ICd6YW1tYWQnDQogICAgICAgIHJlcS5oZWFkZXJzWydYLUFwaS1LZXknXSA9IG9wdGlvbnNbOmFwaV9rZXldDQogICAgICAgIHJlcS5ib2R5ID0gInsgXCJ0ZXh0XCI6IFwiI3thdHRyWzptZXNzYWdlXX1cIiwgXCJ0b1wiOiBcIiN7YXR0cls6cmVjaXBpZW50XX1cIiwgXCJmcm9tXCI6IFwiI3tvcHRpb25zWzpmcm9tXX1cIiB9Ig0KICAgICAgZW5kDQoNCiAgICAgIHJlc3BvbnNlID0gZGF0YS5ib2R5WydzdWNjZXNzJ10NCiAgICAgIFJhaWxzLmxvZ2dlci5kZWJ1ZyAic2V2ZW4gcmVzcG9uc2U6ICN7cmVzcG9uc2V9Ig0KICAgICAgcmFpc2UgcmVzcG9uc2UgaWYgJzEwMCcgIT0gcmVzcG9uc2UNCg0KICAgICAgdHJ1ZQ0KICAgIHJlc2N1ZSA9PiBlDQogICAgICBSYWlscy5sb2dnZXIuZGVidWcgInNldmVuIGVycm9yOiAje2UuaW5zcGVjdH0iDQogICAgICByYWlzZSBlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBwcm9jZXNzKF9vcHRpb25zLCBhdHRyLCBjaGFubmVsKQ0KICAgIGZyb20gPSBhdHRyWydkYXRhJ11bJ3NlbmRlciddDQoNCiAgICBSYWlscy5sb2dnZXIuaW5mbyAiUmVjZWl2aW5nIFNNUyBmcm9tIHJlY2lwaWVudCAje2Zyb219Ig0KDQogICAgaWYgZnJvbS5zdWIoJysnLCAnJykuc2NhbigvXlxkKyQvKS5lbXB0eT8NCiAgICAgIFJhaWxzLmxvZ2dlci5pbmZvICJTa2lwcGluZyBpbmJvdW5kIFNNUyBiZWNhdXNlIHRoZSBzZW5kZXIgaXMgbm90IGEgdmFsaWQgcGhvbmUgbnVtYmVyOiAje2Zyb219Ig0KICAgICAgcmV0dXJuIFs6anNvbiwge31dDQogICAgZW5kDQoNCiAgICBtc2dfaWQgPSBhdHRyWydkYXRhJ11bJ2lkJ10NCiAgICAjIHByZXZlbnQgYWxyZWFkeSBjcmVhdGVkIGFydGljbGVzDQogICAgaWYgVGlja2V0OjpBcnRpY2xlLmV4aXN0cz8obWVzc2FnZV9pZDogbXNnX2lkKQ0KICAgICAgUmFpbHMubG9nZ2VyLmluZm8gIlNraXBwaW5nIGluYm91bmQgU01TIGJlY2F1c2UgYSB0aWNrZXQgd2l0aCB0aGlzIElEIGFscmVhZHkgZXhpc3RzOiAje21zZ19pZH0iDQogICAgICByZXR1cm4gWzpqc29uLCB7fV0NCiAgICBlbmQNCg0KICAgICMgZmluZCBzZW5kZXINCiAgICB1c2VyID0gdXNlcl9ieV9tb2JpbGUoZnJvbSkNCiAgICBVc2VySW5mby5jdXJyZW50X3VzZXJfaWQgPSB1c2VyLmlkDQoNCiAgICBwcm9jZXNzX3RpY2tldChhdHRyLCBjaGFubmVsLCB1c2VyKQ0KDQogICAgWzpqc29uLCB7fV0NCiAgZW5kDQoNCiAgZGVmIGNyZWF0ZV90aWNrZXQoYXR0ciwgY2hhbm5lbCwgdXNlcikNCiAgICB0aXRsZSA9IGN1dF90aXRsZShhdHRyWydkYXRhJ11bJ3RleHQnXSkNCiAgICB0aWNrZXQgPSBUaWNrZXQubmV3KA0KICAgICAgZ3JvdXBfaWQ6IGNoYW5uZWwuZ3JvdXBfaWQsDQogICAgICB0aXRsZTogdGl0bGUsDQogICAgICBzdGF0ZV9pZDogVGlja2V0OjpTdGF0ZS5maW5kX2J5KGRlZmF1bHRfY3JlYXRlOiB0cnVlKS5pZCwNCiAgICAgIHByaW9yaXR5X2lkOiBUaWNrZXQ6OlByaW9yaXR5LmZpbmRfYnkoZGVmYXVsdF9jcmVhdGU6IHRydWUpLmlkLA0KICAgICAgY3VzdG9tZXJfaWQ6IHVzZXIuaWQsDQogICAgICBwcmVmZXJlbmNlczogew0KICAgICAgICBjaGFubmVsX2lkOiBjaGFubmVsLmlkLA0KICAgICAgICBzbXM6IHsNCiAgICAgICAgICBvcmlnaW5hdG9yOiBhdHRyWydkYXRhJ11bJ3NlbmRlciddLA0KICAgICAgICAgIHJlY2lwaWVudDogYXR0clsnZGF0YSddWydzeXN0ZW0nXSwNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICkNCiAgICB0aWNrZXQuc2F2ZSENCiAgICB0aWNrZXQNCiAgZW5kDQoNCiAgZGVmIGNyZWF0ZV9hcnRpY2xlKGF0dHIsIGNoYW5uZWwsIHRpY2tldCkNCiAgICBUaWNrZXQ6OkFydGljbGUuY3JlYXRlISgNCiAgICAgIHRpY2tldF9pZDogdGlja2V0LmlkLA0KICAgICAgdHlwZTogYXJ0aWNsZV90eXBlX3NtcywNCiAgICAgIHNlbmRlcjogVGlja2V0OjpBcnRpY2xlOjpTZW5kZXIuZmluZF9ieShuYW1lOiAnQ3VzdG9tZXInKSwNCiAgICAgIGJvZHk6IGF0dHJbJ2RhdGEnXVsndGV4dCddLA0KICAgICAgZnJvbTogYXR0clsnZGF0YSddWydzZW5kZXInXSwNCiAgICAgIHRvOiBhdHRyWydkYXRhJ11bJ3N5c3RlbSddLA0KICAgICAgbWVzc2FnZV9pZDogYXR0clsnZGF0YSddWydpZCddLA0KICAgICAgY29udGVudF90eXBlOiAndGV4dC9wbGFpbicsDQogICAgICBwcmVmZXJlbmNlczogew0KICAgICAgICBjaGFubmVsX2lkOiBjaGFubmVsLmlkLA0KICAgICAgICBzbXM6IHsNCiAgICAgICAgICBGcm9tOiBhdHRyWydkYXRhJ11bJ3NlbmRlciddLA0KICAgICAgICAgIFRvOiBhdHRyWydkYXRhJ11bJ3N5c3RlbSddLA0KICAgICAgICB9LA0KICAgICAgfQ0KICAgICkNCiAgZW5kDQoNCiAgZGVmIHNlbGYuZGVmaW5pdGlvbg0KICAgIHsNCiAgICAgIG5hbWU6ICdzZXZlbicsDQogICAgICBhZGFwdGVyOiAnc21zL3NldmVuJywNCiAgICAgIGFjY291bnQ6IFsNCiAgICAgICAgeyBuYW1lOiAnb3B0aW9uczo6d2ViaG9va190b2tlbicsIGRpc3BsYXk6IF9fKCdXZWJob29rIFRva2VuJyksIHRhZzogJ2lucHV0JywgdHlwZTogJ3RleHQnLCBsaW1pdDogMjAwLCBudWxsOiBmYWxzZSwgZGVmYXVsdDogRGlnZXN0OjpNRDUuaGV4ZGlnZXN0KFNlY3VyZVJhbmRvbS51dWlkKSwgZGlzYWJsZWQ6IHRydWUsIHJlYWRvbmx5OiB0cnVlIH0sDQogICAgICAgIHsgbmFtZTogJ29wdGlvbnM6OmFwaV9rZXknLCBkaXNwbGF5OiAnQVBJIEtleScsIHRhZzogJ2lucHV0JywgdHlwZTogJ3RleHQnLCBsaW1pdDogNjQsIG51bGw6IGZhbHNlLCBwbGFjZWhvbGRlcjogJ1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgnIH0sDQogICAgICAgIHsgbmFtZTogJ29wdGlvbnM6OmZyb20nLCBkaXNwbGF5OiAnRnJvbScsIHRhZzogJ2lucHV0JywgdHlwZTogJ3RleHQnLCBsaW1pdDogMTYsIG51bGw6IHRydWUsIHBsYWNlaG9sZGVyOiAnMDA0OTE3MTAwMDAwMDAnIH0sDQogICAgICAgIHsgbmFtZTogJ2dyb3VwX2lkJywgZGlzcGxheTogX18oJ0Rlc3RpbmF0aW9uIEdyb3VwJyksIHRhZzogJ3RyZWVfc2VsZWN0JywgbnVsbDogZmFsc2UsIHJlbGF0aW9uOiAnR3JvdXAnLCBudWxsb3B0aW9uOiB0cnVlLCBmaWx0ZXI6IHsgYWN0aXZlOiB0cnVlIH0gfSwNCiAgICAgIF0sDQogICAgICBub3RpZmljYXRpb246IFsNCiAgICAgICAgeyBuYW1lOiAnb3B0aW9uczo6YXBpX2tleScsIGRpc3BsYXk6ICdBUEkgS2V5JywgdGFnOiAnaW5wdXQnLCB0eXBlOiAndGV4dCcsIGxpbWl0OiA2NCwgbnVsbDogZmFsc2UsIHBsYWNlaG9sZGVyOiAnWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCcgfSwNCiAgICAgICAgeyBuYW1lOiAnb3B0aW9uczo6ZnJvbScsIGRpc3BsYXk6ICdGcm9tJywgdGFnOiAnaW5wdXQnLCB0eXBlOiAndGV4dCcsIGxpbWl0OiAxNiwgbnVsbDogdHJ1ZSwgcGxhY2Vob2xkZXI6ICcwMDQ5MTcxMDAwMDAwMCcgfSwNCiAgICAgIF0NCiAgICB9DQogIGVuZA0KZW5kDQo="
62+
"content": "Y2xhc3MgQ2hhbm5lbDo6RHJpdmVyOjpTbXM6OlNldmVuIDwgQ2hhbm5lbDo6RHJpdmVyOjpTbXM6OkJhc2UKICBOQU1FID0gJ3Ntcy9zZXZlbicuZnJlZXplCgogIGRlZiBmZXRjaGFibGU/KF9jaGFubmVsKQogICAgZmFsc2UKICBlbmQKCiAgZGVmIGRlbGl2ZXIob3B0aW9ucywgYXR0ciwgX25vdGlmaWNhdGlvbiA9IGZhbHNlKQogICAgUmFpbHMubG9nZ2VyLmluZm8gIlNlbmRpbmcgU01TIHRvIHJlY2lwaWVudCAje2F0dHJbOnJlY2lwaWVudF19IgoKICAgIGlmIFNldHRpbmcuZ2V0KCdpbXBvcnRfbW9kZScpCiAgICAgIFJhaWxzLmxvZ2dlci5pbmZvICJBYm9ydGluZyBzZXZlbiBTTVMgdG8gI3thdHRyWzpyZWNpcGllbnRdfSBiZWNhdXNlIGltcG9ydCBtb2RlIGlzIGVuYWJsZWQiCiAgICAgIHJldHVybiB0cnVlCiAgICBlbmQKCiAgICBpZiBTZXR0aW5nLmdldCgnZGV2ZWxvcGVyX21vZGUnKQogICAgICBSYWlscy5sb2dnZXIuaW5mbyAiQWJvcnRpbmcgc2V2ZW4gU01TIHRvICN7YXR0cls6cmVjaXBpZW50XX0gYmVjYXVzZSBkZXZlbG9wZXIgbW9kZSBpcyBlbmFibGVkIgogICAgICByZXR1cm4gdHJ1ZQogICAgZW5kCgogICAgUmFpbHMubG9nZ2VyLmluZm8gIkJhY2tlbmQgc2VuZGluZyBzZXZlbiBTTVMgdG8gI3thdHRyWzpyZWNpcGllbnRdfSIKCiAgICBiZWdpbgogICAgICBjb25uID0gRmFyYWRheS5uZXcgZG8gfGZ8CiAgICAgICAgZi5yZXF1ZXN0IDpqc29uCiAgICAgICAgZi5yZXNwb25zZSA6anNvbgogICAgICBlbmQKICAgICAgZGF0YSA9IGNvbm4ucG9zdCBkbyB8cmVxfAogICAgICAgIHJlcS51cmwgJ2h0dHBzOi8vZ2F0ZXdheS5zZXZlbi5pby9hcGkvc21zJwogICAgICAgIHJlcS5oZWFkZXJzWydBY2NlcHQnXSA9ICdhcHBsaWNhdGlvbi9qc29uJwogICAgICAgIHJlcS5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJwogICAgICAgIHJlcS5oZWFkZXJzWydTZW50V2l0aCddID0gJ3phbW1hZCcKICAgICAgICByZXEuaGVhZGVyc1snWC1BcGktS2V5J10gPSBvcHRpb25zWzphcGlfa2V5XQogICAgICAgIHJlcS5ib2R5ID0geyB0ZXh0OiBhdHRyWzptZXNzYWdlXSwgdG86IGF0dHJbOnJlY2lwaWVudF0sIGZyb206IG9wdGlvbnNbOmZyb21dIH0KICAgICAgZW5kCgogICAgICByZXNwb25zZSA9IGRhdGEuYm9keVsnc3VjY2VzcyddCiAgICAgIFJhaWxzLmxvZ2dlci5kZWJ1ZyAic2V2ZW4gcmVzcG9uc2U6ICN7cmVzcG9uc2V9IgogICAgICByYWlzZSByZXNwb25zZSBpZiAnMTAwJyAhPSByZXNwb25zZQoKICAgICAgdHJ1ZQogICAgcmVzY3VlID0+IGUKICAgICAgUmFpbHMubG9nZ2VyLmRlYnVnICJzZXZlbiBlcnJvcjogI3tlLmluc3BlY3R9IgogICAgICByYWlzZSBlCiAgICBlbmQKICBlbmQKCiAgZGVmIHByb2Nlc3MoX29wdGlvbnMsIGF0dHIsIGNoYW5uZWwpCiAgICBmcm9tID0gYXR0clsnZGF0YSddWydzZW5kZXInXQoKICAgIFJhaWxzLmxvZ2dlci5pbmZvICJSZWNlaXZpbmcgU01TIGZyb20gcmVjaXBpZW50ICN7ZnJvbX0iCgogICAgaWYgZnJvbS5zdWIoJysnLCAnJykuc2NhbigvXlxkKyQvKS5lbXB0eT8KICAgICAgUmFpbHMubG9nZ2VyLmluZm8gIlNraXBwaW5nIGluYm91bmQgU01TIGJlY2F1c2UgdGhlIHNlbmRlciBpcyBub3QgYSB2YWxpZCBwaG9uZSBudW1iZXI6ICN7ZnJvbX0iCiAgICAgIHJldHVybiBbOmpzb24sIHt9XQogICAgZW5kCgogICAgbXNnX2lkID0gYXR0clsnZGF0YSddWydpZCddCiAgICAjIHByZXZlbnQgYWxyZWFkeSBjcmVhdGVkIGFydGljbGVzCiAgICBpZiBUaWNrZXQ6OkFydGljbGUuZXhpc3RzPyhtZXNzYWdlX2lkOiBtc2dfaWQpCiAgICAgIFJhaWxzLmxvZ2dlci5pbmZvICJTa2lwcGluZyBpbmJvdW5kIFNNUyBiZWNhdXNlIGEgdGlja2V0IHdpdGggdGhpcyBJRCBhbHJlYWR5IGV4aXN0czogI3ttc2dfaWR9IgogICAgICByZXR1cm4gWzpqc29uLCB7fV0KICAgIGVuZAoKICAgICMgZmluZCBzZW5kZXIKICAgIHVzZXIgPSB1c2VyX2J5X21vYmlsZShmcm9tKQogICAgVXNlckluZm8uY3VycmVudF91c2VyX2lkID0gdXNlci5pZAoKICAgIHByb2Nlc3NfdGlja2V0KGF0dHIsIGNoYW5uZWwsIHVzZXIpCgogICAgWzpqc29uLCB7fV0KICBlbmQKCiAgZGVmIGNyZWF0ZV90aWNrZXQoYXR0ciwgY2hhbm5lbCwgdXNlcikKICAgIHRpdGxlID0gY3V0X3RpdGxlKGF0dHJbJ2RhdGEnXVsndGV4dCddKQogICAgdGlja2V0ID0gVGlja2V0Lm5ldygKICAgICAgZ3JvdXBfaWQ6IGNoYW5uZWwuZ3JvdXBfaWQsCiAgICAgIHRpdGxlOiB0aXRsZSwKICAgICAgc3RhdGVfaWQ6IFRpY2tldDo6U3RhdGUuZmluZF9ieShkZWZhdWx0X2NyZWF0ZTogdHJ1ZSkuaWQsCiAgICAgIHByaW9yaXR5X2lkOiBUaWNrZXQ6OlByaW9yaXR5LmZpbmRfYnkoZGVmYXVsdF9jcmVhdGU6IHRydWUpLmlkLAogICAgICBjdXN0b21lcl9pZDogdXNlci5pZCwKICAgICAgcHJlZmVyZW5jZXM6IHsKICAgICAgICBjaGFubmVsX2lkOiBjaGFubmVsLmlkLAogICAgICAgIHNtczogewogICAgICAgICAgb3JpZ2luYXRvcjogYXR0clsnZGF0YSddWydzZW5kZXInXSwKICAgICAgICAgIHJlY2lwaWVudDogYXR0clsnZGF0YSddWydzeXN0ZW0nXSwKICAgICAgICB9CiAgICAgIH0KICAgICkKICAgIHRpY2tldC5zYXZlIQogICAgdGlja2V0CiAgZW5kCgogIGRlZiBjcmVhdGVfYXJ0aWNsZShhdHRyLCBjaGFubmVsLCB0aWNrZXQpCiAgICBUaWNrZXQ6OkFydGljbGUuY3JlYXRlISgKICAgICAgdGlja2V0X2lkOiB0aWNrZXQuaWQsCiAgICAgIHR5cGU6IGFydGljbGVfdHlwZV9zbXMsCiAgICAgIHNlbmRlcjogVGlja2V0OjpBcnRpY2xlOjpTZW5kZXIuZmluZF9ieShuYW1lOiAnQ3VzdG9tZXInKSwKICAgICAgYm9keTogYXR0clsnZGF0YSddWyd0ZXh0J10sCiAgICAgIGZyb206IGF0dHJbJ2RhdGEnXVsnc2VuZGVyJ10sCiAgICAgIHRvOiBhdHRyWydkYXRhJ11bJ3N5c3RlbSddLAogICAgICBtZXNzYWdlX2lkOiBhdHRyWydkYXRhJ11bJ2lkJ10sCiAgICAgIGNvbnRlbnRfdHlwZTogJ3RleHQvcGxhaW4nLAogICAgICBwcmVmZXJlbmNlczogewogICAgICAgIGNoYW5uZWxfaWQ6IGNoYW5uZWwuaWQsCiAgICAgICAgc21zOiB7CiAgICAgICAgICBGcm9tOiBhdHRyWydkYXRhJ11bJ3NlbmRlciddLAogICAgICAgICAgVG86IGF0dHJbJ2RhdGEnXVsnc3lzdGVtJ10sCiAgICAgICAgfSwKICAgICAgfQogICAgKQogIGVuZAoKICBkZWYgc2VsZi5kZWZpbml0aW9uCiAgICB7CiAgICAgIG5hbWU6ICdzZXZlbicsCiAgICAgIGFkYXB0ZXI6ICdzbXMvc2V2ZW4nLAogICAgICBhY2NvdW50OiBbCiAgICAgICAgeyBuYW1lOiAnb3B0aW9uczo6d2ViaG9va190b2tlbicsIGRpc3BsYXk6IF9fKCdXZWJob29rIFRva2VuJyksIHRhZzogJ2lucHV0JywgdHlwZTogJ3RleHQnLCBsaW1pdDogMjAwLCBudWxsOiBmYWxzZSwgZGVmYXVsdDogRGlnZXN0OjpNRDUuaGV4ZGlnZXN0KFNlY3VyZVJhbmRvbS51dWlkKSwgZGlzYWJsZWQ6IHRydWUsIHJlYWRvbmx5OiB0cnVlIH0sCiAgICAgICAgeyBuYW1lOiAnb3B0aW9uczo6YXBpX2tleScsIGRpc3BsYXk6ICdBUEkgS2V5JywgdGFnOiAnaW5wdXQnLCB0eXBlOiAndGV4dCcsIGxpbWl0OiA2NCwgbnVsbDogZmFsc2UsIHBsYWNlaG9sZGVyOiAnWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCcgfSwKICAgICAgICB7IG5hbWU6ICdvcHRpb25zOjpmcm9tJywgZGlzcGxheTogJ0Zyb20nLCB0YWc6ICdpbnB1dCcsIHR5cGU6ICd0ZXh0JywgbGltaXQ6IDE2LCBudWxsOiB0cnVlLCBwbGFjZWhvbGRlcjogJzAwNDkxNzEwMDAwMDAwJyB9LAogICAgICAgIHsgbmFtZTogJ2dyb3VwX2lkJywgZGlzcGxheTogX18oJ0Rlc3RpbmF0aW9uIEdyb3VwJyksIHRhZzogJ3RyZWVfc2VsZWN0JywgbnVsbDogZmFsc2UsIHJlbGF0aW9uOiAnR3JvdXAnLCBudWxsb3B0aW9uOiB0cnVlLCBmaWx0ZXI6IHsgYWN0aXZlOiB0cnVlIH0gfSwKICAgICAgXSwKICAgICAgbm90aWZpY2F0aW9uOiBbCiAgICAgICAgeyBuYW1lOiAnb3B0aW9uczo6YXBpX2tleScsIGRpc3BsYXk6ICdBUEkgS2V5JywgdGFnOiAnaW5wdXQnLCB0eXBlOiAndGV4dCcsIGxpbWl0OiA2NCwgbnVsbDogZmFsc2UsIHBsYWNlaG9sZGVyOiAnWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCcgfSwKICAgICAgICB7IG5hbWU6ICdvcHRpb25zOjpmcm9tJywgZGlzcGxheTogJ0Zyb20nLCB0YWc6ICdpbnB1dCcsIHR5cGU6ICd0ZXh0JywgbGltaXQ6IDE2LCBudWxsOiB0cnVlLCBwbGFjZWhvbGRlcjogJzAwNDkxNzEwMDAwMDAwJyB9LAogICAgICBdCiAgICB9CiAgZW5kCmVuZAo="
5863
}
5964
]
6065
}

0 commit comments

Comments
 (0)