Can this be used for multiple connections?

Hi,
Thanks very much for the script.
I have got it set up and eventually solved pointing a VLAN at it so can use it as a gateway for a wireless network.
I have a question though.
Can this script be used or modified easily to have multiple endpoints?
Ideally I want to have three connections, one in the UK, one in the EU and one in the US.
Is this possible, perhaps with three copies of the script?
Failing that perhaps point me in the right direction for what I'd need to modify to accomplish this?
Cheers,
Westy

Hi Westy,
This script does indeed support this, you'll need to make 2 more copies of this script.
Duplicate PIAWireguard.py to PIAWireguardEU.py and PIAWireguardUS.py
Edit these two new copies and amend the opnsenseWGName variable according to PIAEU and PIAUS, along with the piaRegionId of course to match the right regions names from PIA.
Then we modify the contents of /usr/local/opnsense/service/conf/actions.d/actions_piawireguard.conf
New contents as follows
## /usr/local/opnsense/service/conf/actions.d

[piaWireGuard]
command:/conf/PIAWireguard.py
parameters: %s %s
type:script_output
message:Running PIA WireGuard Script : /conf/PIAWireguard.py %s %s
description:PIA WireGuard UK

[piaWireGuardEU]
command:/conf/PIAWireguardEU.py
parameters: %s %s
type:script_output
message:Running PIA WireGuard Script : /conf/PIAWireguardEU.py %s %s
description:PIA WireGuard EU

[piaWireGuardUS]
command:/conf/PIAWireguardUS.py
parameters: %s %s
type:script_output
message:Running PIA WireGuard Script : /conf/PIAWireguardUS.py %s %s
description:PIA WireGuard US

Then we need to chmod the new files and then restart confid
chmod +x /conf/PIAWireguardEU.py
chmod +x /conf/PIAWireguardUS.py
service configd restart
Now setup the initial creation with debug mode to check it doesn't cause any errors.
/conf/PIAWireguardEU.py debug
/conf/PIAWireguardUS.py debug
Basically follow the steps from the readme again but with the new filenames and interface names 😀
I hope all this makes sense?

FingerlessGloves

Hi mate,
Thanks for the speedy response!
Yes, that makes perfect sense. I'll give it a go.
Thanks a lot!
Westy

Hey,
No problem at all! Hopefully it'll go well. Once you gotten it working, and the extra 2 cron items. Give it a reboot and make sure all the tunnels work, if they do without you needing to do anything, then all is well 😀. Remember the cron time will need to hit after a reboot for the script to do its checks and see that you've rebooted the device and it needs to make sure the tunnel connection information is correct.
FingerlessGloves

Hiya,
So, all looks good, all VLANs setup and rules cloned.
Think nearly there.
I do have both gateways appearing as offline at the moment though, despite having an IP.
Any ideas?

I can't reboot at the moment otherwise I'll get grief :)
Cheers,
Westy

Ok that's little strange...
Go to "VPN: WireGuard", then the "List Configuration" tab, is there a handshake on each PIA wireguard peer?

Yeah, although they have a zero afterwards.

Here's the other tabs:

I know why! I forgot about one setting, sorry about that.
In the WireGuardEU and WireGaurdUS conf, the wireguard port variable opnsenseWGPort  needs amending. Each instance can't share the same port.
Change them to 51816 and 51817, then also change it manually in the WebUI to also match. That'll do the trick.
PIA = 51815
PIAEU = 51816
PIAUS = 51817

Ahh, gotcha.
Thanks mate, you've been fantastic!
I'll give that a go now!

Yes!
They are now both up. Excellent stuff :)

Okay, I have one final issue, and I don't think it's related to your VPN script as such, but it's certainly given me more IPs (and whilst you're proving such valuable help!)
I keep on failing to connect to my certificated name for OPNsense, that has a DNS entry on Cloudflare. I suspect because it's picking an IP that is not on the same subnet.
`westy@Wiggum OPNsensePIAWireguard % nslookup opnsense
Server:		<IP_ADDRESS>
Address:	<IP_ADDRESS>#53
Non-authoritative answer:
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>
Name:	opnsense.[mydomain.net]
Address: <IP_ADDRESS>`
I am using AdGuard Home has my first DNS endpoint (on port 5353), that then forwards to <IP_ADDRESS>:5353.
Wonder if I need to add <IP_ADDRESS>:5353 etc to there?
Any ideas?
Cheers

Hmm, maybe I need to try and restrict access to port 53 for each VLAN:
https://serverfault.com/questions/788429/how-to-limit-a-dns-stub-zone-to-a-specific-subnet
Will have a tinker.

Sweet that working nicely now then.
Oh no that's not an issue related to my script but to how OPNsense registers each interface in Unbound DNS.
What I do is change domain in "System: Settings: General" to fw
Then create host overrides for the DNS name I want OPNsense to be, then go to "System: Settings: Administration", then add the alternatives DNS names for the Firewall to the settings "Alternate Hostnames"
I shall close this issue since the topic of the issue is fixed.
You can find me in IRC, if you want help with the DNS issue 😀 (#OPNsense on FreeNode)

Hello I followed this instruction but I have an issue
Sometimes Two servers gave an IP in the same subnet

Do you have a fix for this ?

If servers have the same IP range, that shouldn't stop the interface coming up. Also wg1 and wg3,  are in the same /16 but we don't address the network interfaces as /16 we do them as /32, and same with the gateway. Usually the interface not coming up is because the port is already in use or the peer us using DNS for the address and couldn't be resolved.
In theory OPNsense should still be able to deal with two interfaces on the same network. Routing I've not tested two interfaces on the same network, and then using the gateway rules to direct traffic. I think there's a bug where two gateways can't have the same IP. It's an issue that's been fixed in pfSense but not OPNsense.
Are the gateways for wg1 and wg3 the same?

 I'm guessing it doens't support WireGuard gateway being the same for two locals.
It's probably adding the gateway to the routing table but in a way if it's already there erroring maybe. You can manually edit the non working Local, and change the gateway, just increment it by 1 IP and then see if it comes up ok.

as a fix I runed again the debug changeserver command to this result

Yes so it's definately the gateway server being the same.
If you leave the cron running, it may automaticly change server again because it's not seen a handshake.
Wait for it to happen again and then report back the output of the effected server with just debug argument. See what the script thinks of the interface not being up.

Ok If understand I wait for the next issue then I run the corresponding py file with the debug only argument then I paste the result here am I right ?

That's 100% right 😊

hello again
I rebooted my firewall yesterday to add some CPU to improve performance
When it started, all of my gateways came back but 4 were offline because they had the same IP (http://<IP_ADDRESS>/) I didn't care about it and thought the gateway group I set up will do the job to maintain internet access to my VM to the next cron schedule, but I was wrong my opnsense crashed multiples times. When I saw this I checked everything possible then I found it was just all of Wireguard VPN crash looping at the startup.
To fix this I run at the first minute of the uptime of opnsense the debug changeserver` command for each of my PIA_WAN
Now I don't have the issue
Could you update the cronjob that checks whether the new gateway has the same IP as an existing gateway?
If so, simply run the changeserver command again

Yes you can just run changeserver when the issue happens again.

It should really support multiple gateways with the same IP, that's a OPNsense issue that it doesn't.
The script unoffically supported multiple tunnels, I shall look to add multiple tunnel support at somepoint but not quite yet.

Hello I have errors again even If I do changeserver command
this is my actual setup :

and I have this error in logs :

could you please help me

Interesting that you post that as I recently just lost both my WG Tunnels over PIA. I put it down to me screwing around with trying to get an inbound RoadWarrior tunnel setup.
I have 2 tunnels, one with PF and one without. The one with PF produces the following result on ./PIAWireguard.py changeserver debug:
`WGInstanceUUID: [redacted]
WGPeerUUID: [redacted]
WGInstance: [redacted]
WGPeer: [redacted]
Force server change requested
metaServer
CN: vancouver406
IP: 162.216.[redacted]
wgServer
CN: vancouver406
IP: 162.216.[redacted]
Your PIA Token (Meta), DO NOT GIVE THIS TO ANYONE
{
"status": "OK",
"token": "[redacted]"
}
WG Server connection information
{
"status": "OK",
"server_key": "[redacted]",
"server_port": 1337,
"server_ip": "162.216.[redacted]",
"server_vip": "10.5.[redacted]",
"peer_ip": "10.5.[redacted]",
"peer_pubkey": "[redacted]",
"dns_servers": [
"<IP_ADDRESS>",
"<IP_ADDRESS>"
]
}
Saved wireguard server information to /tmp/wg1_piaserverinfo
Saved server_vip to /tmp/wg1_router
Wait 5 seconds for new WireGuard server to apply before port forwarding
Port not assigned, shall request port
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "/usr/local/lib/python3.9/site-packages/urllib3/util/connection.py", line 95, in create_connection
raise err
File "/usr/local/lib/python3.9/site-packages/urllib3/util/connection.py", line 85, in create_connection
sock.connect(sa)
TimeoutError: [Errno 60] Operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 715, in urlopen
httplib_response = self._make_request(
File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 404, in _make_request
self._validate_conn(conn)
File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 1058, in _validate_conn
conn.connect()
File "/usr/local/lib/python3.9/site-packages/urllib3/connection.py", line 363, in connect
self.sock = conn = self._new_conn()
File "/usr/local/lib/python3.9/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x84cd0f1c0>: Failed to establish a new connection: [Errno 60] Operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/requests/adapters.py", line 486, in send
resp = conn.urlopen(
File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 799, in urlopen
retries = retries.increment(
File "/usr/local/lib/python3.9/site-packages/urllib3/util/retry.py", line 592, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='vancouver406', port=19999): Max retries exceeded with url: /getSignature?token=[redacted] (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x84cd0f1c0>: Failed to establish a new connection: [Errno 60] Operation timed out'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/conf/./PIAWireguard.py", line 771, in
wireguardSignatureResponse = requests.get(f"https://{wireguardServerInfo['server_name']}:19999/getSignature", params=createObject, verify=piaCA)
File "/usr/local/lib/python3.9/site-packages/requests/api.py", line 73, in get
return request("get", url, params=params, **kwargs)
File "/usr/local/lib/python3.9/site-packages/requests/api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 589, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 703, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python3.9/site-packages/requests/adapters.py", line 519, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='vancouver406', port=19999): Max retries exceeded with url: /getSignature?token=[redacted] (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x84cd0f1c0>: Failed to establish a new connection: [Errno 60] Operation timed out'))
`
Although the other tunnel with no PF seems to complete the script at least:
`WGInstanceUUID: [redacted]
WGPeerUUID: [redacted]
WGInstance: [redacted]
WGPeer: [redacted]
Force server change requested
metaServer
CN: wyoming401
IP: 154.6.[redacted]
wgServer
CN: wyoming401
IP: 154.6.[redacted]
Your PIA Token (Meta), DO NOT GIVE THIS TO ANYONE
{
"status": "OK",
"token": "[redacted]"
}
WG Server connection information
{
"status": "OK",
"server_key": "[redacted]",
"server_port": 1337,
"server_ip": "154.6.[redacted]",
"server_vip": "10.6.[redacted]",
"peer_ip": "10.6.[redacted]",
"peer_pubkey": "[redacted]",
"dns_servers": [
"<IP_ADDRESS>",
"<IP_ADDRESS>"
]
}
Saved wireguard server information to /tmp/wg2_piaserverinfo
Saved server_vip to /tmp/wg2_router`
I am pretty certain that the PF is failing because the connection is failing and both tunnels report as being up but offline with no traffic over them. I have checked and double checked the settings and they all seem OK so I took it as a sign that life wants me to rebuild my OPNsense instance...

could you please help me

Are your scripts up to date?
I can't see any issues on those screenshots and my UK PIA connection is able to change server without problem.

could you please help me

Are your scripts up to date?
I can't see any issues on those screenshots and my UK PIA connection is able to change server without problem.

I think yes I did the last update before upgrading my instance

@FingerlessGlov3s How can I check it ?

@FingerlessGlov3s
did it seems to be up to date :
root@anti-skill:/conf # ls -l *py
-rwxr-xr-x  1 root  wheel  41331 Nov 14 16:50 PIAWireguardFrance.py
-rwxr-xr-x  1 root  wheel  41334 Nov 14 17:04 PIAWireguardFrankfurt.py
-rwxr-xr-x  1 root  wheel  41331 Nov 14 16:51 PIAWireguardMonaco.py
-rwxr-xr-x  1 root  wheel  41335 Nov 14 16:51 PIAWireguardNetherland.py
-rwxr-xr-x  1 root  wheel  41330 Nov 14 16:52 PIAWireguardSwiss.py
-rwxr-xr-x  1 root  wheel  41327 Nov 14 16:52 PIAWireguardUK.py
-rwxr-xr-x  1 root  wheel  41327 Nov 14 16:52 PIAWireguardUS.py
root@anti-skill:/conf # grep -H "wireguardPeerInstanceInfo" *py
PIAWireguardFrance.py:    wireguardPeerInstanceInfo = json.loads(r.text)
PIAWireguardFrance.py:    wireguardPeerInstanceInfo['client']['enabled'] = '1'
PIAWireguardFrance.py:    wireguardPeerInstanceInfo['client']['serveraddress'] = wireguardServerInfo['server_ip']
PIAWireguardFrance.py:    wireguardPeerInstanceInfo['client']['serverport'] = wireguardServerInfo['server_port']
PIAWireguardFrance.py:    wireguardPeerInstanceInfo['client']['pubkey'] = wireguardServerInfo['server_key']
PIAWireguardFrance.py:    wireguardPeerInstanceInfo['client']['tunneladdress'] = "<IP_ADDRESS>/0"
PIAWireguardFrance.py:    wireguardPeerInstanceInfo['client']['keepalive'] = "25"
PIAWireguardFrance.py:    wireguardPeerInstanceInfo['client']['servers'] = opnsenseWGUUID
PIAWireguardFrance.py:    r = requests.post(f'{opnsenseURL}/api/wireguard/client/setClient/{opnsenseWGPeerUUID}', data=json.dumps(wireguardPeerInstanceInfo), headers=headers, auth=(config['opnsenseKey'], config['opnsenseSecret']), verify=urlVerify)
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo = json.loads(r.text)
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo['client']['enabled'] = '1'
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo['client']['serveraddress'] = wireguardServerInfo['server_ip']
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo['client']['serverport'] = wireguardServerInfo['server_port']
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo['client']['pubkey'] = wireguardServerInfo['server_key']
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo['client']['tunneladdress'] = "<IP_ADDRESS>/0"
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo['client']['keepalive'] = "25"
PIAWireguardFrankfurt.py:    wireguardPeerInstanceInfo['client']['servers'] = opnsenseWGUUID
PIAWireguardFrankfurt.py:    r = requests.post(f'{opnsenseURL}/api/wireguard/client/setClient/{opnsenseWGPeerUUID}', data=json.dumps(wireguardPeerInstanceInfo), headers=headers, auth=(config['opnsenseKey'], config['opnsenseSecret']), verify=urlVerify)
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo = json.loads(r.text)
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo['client']['enabled'] = '1'
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo['client']['serveraddress'] = wireguardServerInfo['server_ip']
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo['client']['serverport'] = wireguardServerInfo['server_port']
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo['client']['pubkey'] = wireguardServerInfo['server_key']
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo['client']['tunneladdress'] = "<IP_ADDRESS>/0"
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo['client']['keepalive'] = "25"
PIAWireguardMonaco.py:    wireguardPeerInstanceInfo['client']['servers'] = opnsenseWGUUID
PIAWireguardMonaco.py:    r = requests.post(f'{opnsenseURL}/api/wireguard/client/setClient/{opnsenseWGPeerUUID}', data=json.dumps(wireguardPeerInstanceInfo), headers=headers, auth=(config['opnsenseKey'], config['opnsenseSecret']), verify=urlVerify)
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo = json.loads(r.text)
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo['client']['enabled'] = '1'
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo['client']['serveraddress'] = wireguardServerInfo['server_ip']
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo['client']['serverport'] = wireguardServerInfo['server_port']
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo['client']['pubkey'] = wireguardServerInfo['server_key']
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo['client']['tunneladdress'] = "<IP_ADDRESS>/0"
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo['client']['keepalive'] = "25"
PIAWireguardNetherland.py:    wireguardPeerInstanceInfo['client']['servers'] = opnsenseWGUUID
PIAWireguardNetherland.py:    r = requests.post(f'{opnsenseURL}/api/wireguard/client/setClient/{opnsenseWGPeerUUID}', data=json.dumps(wireguardPeerInstanceInfo), headers=headers, auth=(config['opnsenseKey'], config['opnsenseSecret']), verify=urlVerify)
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo = json.loads(r.text)
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo['client']['enabled'] = '1'
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo['client']['serveraddress'] = wireguardServerInfo['server_ip']
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo['client']['serverport'] = wireguardServerInfo['server_port']
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo['client']['pubkey'] = wireguardServerInfo['server_key']
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo['client']['tunneladdress'] = "<IP_ADDRESS>/0"
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo['client']['keepalive'] = "25"
PIAWireguardSwiss.py:    wireguardPeerInstanceInfo['client']['servers'] = opnsenseWGUUID
PIAWireguardSwiss.py:    r = requests.post(f'{opnsenseURL}/api/wireguard/client/setClient/{opnsenseWGPeerUUID}', data=json.dumps(wireguardPeerInstanceInfo), headers=headers, auth=(config['opnsenseKey'], config['opnsenseSecret']), verify=urlVerify)
PIAWireguardUK.py:    wireguardPeerInstanceInfo = json.loads(r.text)
PIAWireguardUK.py:    wireguardPeerInstanceInfo['client']['enabled'] = '1'
PIAWireguardUK.py:    wireguardPeerInstanceInfo['client']['serveraddress'] = wireguardServerInfo['server_ip']
PIAWireguardUK.py:    wireguardPeerInstanceInfo['client']['serverport'] = wireguardServerInfo['server_port']
PIAWireguardUK.py:    wireguardPeerInstanceInfo['client']['pubkey'] = wireguardServerInfo['server_key']
PIAWireguardUK.py:    wireguardPeerInstanceInfo['client']['tunneladdress'] = "<IP_ADDRESS>/0"
PIAWireguardUK.py:    wireguardPeerInstanceInfo['client']['keepalive'] = "25"
PIAWireguardUK.py:    wireguardPeerInstanceInfo['client']['servers'] = opnsenseWGUUID
PIAWireguardUK.py:    r = requests.post(f'{opnsenseURL}/api/wireguard/client/setClient/{opnsenseWGPeerUUID}', data=json.dumps(wireguardPeerInstanceInfo), headers=headers, auth=(config['opnsenseKey'], config['opnsenseSecret']), verify=urlVerify)
PIAWireguardUS.py:    wireguardPeerInstanceInfo = json.loads(r.text)
PIAWireguardUS.py:    wireguardPeerInstanceInfo['client']['enabled'] = '1'
PIAWireguardUS.py:    wireguardPeerInstanceInfo['client']['serveraddress'] = wireguardServerInfo['server_ip']
PIAWireguardUS.py:    wireguardPeerInstanceInfo['client']['serverport'] = wireguardServerInfo['server_port']
PIAWireguardUS.py:    wireguardPeerInstanceInfo['client']['pubkey'] = wireguardServerInfo['server_key']
PIAWireguardUS.py:    wireguardPeerInstanceInfo['client']['tunneladdress'] = "<IP_ADDRESS>/0"
PIAWireguardUS.py:    wireguardPeerInstanceInfo['client']['keepalive'] = "25"
PIAWireguardUS.py:    wireguardPeerInstanceInfo['client']['servers'] = opnsenseWGUUID
PIAWireguardUS.py:    r = requests.post(f'{opnsenseURL}/api/wireguard/client/setClient/{opnsenseWGPeerUUID}', data=json.dumps(wireguardPeerInstanceInfo), headers=headers, auth=(config['opnsenseKey'], config['opnsenseSecret']), verify=urlVerify)
root@anti-skill:/conf #

What happens if you add the debug command as well to the changeserver in the console? Does that tell us anything extra?

ok this is the situation before I type the debug command :

UK and US showing as same gateway which will cause problems, best to change server on both

Happened sometimes let me give a try
root@anti-skill:/conf # ./PIAWireguardUK.py debug changeserver
WGInstanceUUID: dbeb40e0-210d-47a9-a5fc-7407d88cb585
WGPeerUUID: bd4526d4-07dd-4609-ac42-d118dbfdee82
WGInstance: ZfgszJw3rMSNEEqauJKuV/PK/nwAzu98RfuBg1Wrc1c=
WGPeer: fwHp2KWXCwcdItCdldcbNMP1XMXRWrLlvWuTvmdsgAk=
Force server change requested
metaServer
CN: london441
IP: <IP_ADDRESS>
wgServer
CN: london441
IP: <IP_ADDRESS>
Your PIA Token (Meta), DO NOT GIVE THIS TO ANYONE
{
   "status": "OK",
   "token": "B4Xk851diwztpDqshyYD5F8n7CXE_CtMGKe3Dmh4KDV7hRHyxSFg37FWx8zBsd7mWpsfkwfOz9yEnaofAxvSBynsg2nJ+qYXxANjUqChS0i+hF+IBccncE3naBw="
}

WG Server connection information
{
   "status": "OK",
   "server_key": "DpBctA+bwx0wt5p0gmeT/SSr6OMUAtEPWz3Hm6Arfwc=",
   "server_port": 1337,
   "server_ip": "<IP_ADDRESS>",
   "server_vip": "<IP_ADDRESS>",
   "peer_ip": "<IP_ADDRESS>",
   "peer_pubkey": "ZfgszJw3rMSNEEqauJKuV/PK/nwAzu98RfuBg1Wrc1c=",
   "dns_servers": [
       "<IP_ADDRESS>",
       "<IP_ADDRESS>"
   ]
}

Saved wireguard server information to /tmp/wg6_piaserverinfo
Saved server_vip to /tmp/wg6_router
root@anti-skill:/conf # ./PIAWireguardUS.py debug changeserver
WGInstanceUUID: 82470223-39ae-4ad8-916c-1c4007685235
WGPeerUUID: f5d81fca-a70f-497e-a73a-5ff478a85e1f
WGInstance: DKyi3UIfN5YUXWh+nLV1n42jMgqwnB2mR8Afnw1I1m8=
WGPeer: m7eg7oathAav4UnFVakbc74wrfnskRo2y275c5LmWF4=
Force server change requested
metaServer
CN: newjersey425
IP: <IP_ADDRESS>
wgServer
CN: newjersey425
IP: <IP_ADDRESS>
Your PIA Token (Meta), DO NOT GIVE THIS TO ANYONE
{
   "status": "OK",
   "token": "VNlp_MLuNsebqjP2iGJFBq_JF4Fa4mtFSPSgmG8BWs8XujHHsa_aBOyDu1eiRXs6Cls4TXI_lGBJ5EO7L0mUBA3m1sLK+qYXB+krSRlH8DkUH9twHCo7jrz53Gs="
}

WG Server connection information
{
   "status": "OK",
   "server_key": "hPypOkyN7wgfRoVMAJsJe6mFnTAFrwp3VA3kIG4dQHY=",
   "server_port": 1337,
   "server_ip": "<IP_ADDRESS>",
   "server_vip": "<IP_ADDRESS>",
   "peer_ip": "<IP_ADDRESS>",
   "peer_pubkey": "DKyi3UIfN5YUXWh+nLV1n42jMgqwnB2mR8Afnw1I1m8=",
   "dns_servers": [
       "<IP_ADDRESS>",
       "<IP_ADDRESS>"
   ]
}

Saved wireguard server information to /tmp/wg7_piaserverinfo
Saved server_vip to /tmp/wg7_router
root@anti-skill:/conf #

not better :

I use 10.10.x.x and 192.168.0.x and 192.168.229.x for my lan

one more run on US gave it back alone :

now frankfurt and US are sharing gateway IPs

How can we protect us from this ?

Currently nothing, but would need to find a way to check if the gateway given by PIA is already in the routing table, and if it is then try another server, but the script isn't really built for multiple instances. I need to get some time to fully rewrite it with multiple instances in mind, and I can then try put some logic in the code to hopefully.
Sometimes PIA only give you one server to connect too, so would need it make it hold off for like 5 minutes to see if another server is rotated in to the list for use... 🤔  Needs some thought.

How can we protect us from this ?

You can't without rewriting parts of the script, like I said in the previous comment.

Currently nothing, but would need to find a way to check if the gateway given by PIA is already in the routing table, and if it is then try another server, but the script isn't really built for multiple instances. I need to get some time to fully rewrite it with multiple instances in mind, and I can then try put some logic in the code to hopefully.
Sometimes PIA only give you one server to connect too, so would need it make it hold off for like 5 minutes to see if another server is rotated in to the list for use... 🤔  Needs some thought.

Ok thanks for your job and for this amazing project good luck for coding this and ask me if you need some test

You can't without rewriting parts of the script, like I said in the previous comment.

Sry r' GitHub loading issues 😅

I'll update this issue when I officially add support for it 😊.

Sry GitHub loading issues 😅
Ah that makes sense 😅

Hey guys,
Happy to help testing or code reviewing if needed for any updates that add multiple connection support, since I'm still using several!
Cheers,
Westy

delta.
please not expose not public data to internet.. see above
Eero
On Thu 4. Jan 2024 at 1.43, delta-whiplash @.***> wrote:

Happened sometimes let me give a try
@.***:/conf # ./PIAWireguardUK.py debug changeserver
WGInstanceUUID: dbeb40e0-210d-47a9-a5fc-7407d88cb585
WGPeerUUID: bd4526d4-07dd-4609-ac42-d118dbfdee82
WGInstance: ZfgszJw3rMSNEEqauJKuV/PK/nwAzu98RfuBg1Wrc1c=
WGPeer: fwHp2KWXCwcdItCdldcbNMP1XMXRWrLlvWuTvmdsgAk=
Force server change requested
metaServer
CN: london441
IP: <IP_ADDRESS>
wgServer
CN: london441
IP: <IP_ADDRESS>
Your PIA Token (Meta), DO NOT GIVE THIS TO ANYONE
{
"status": "OK",
"token": "B4Xk851diwztpDqshyYD5F8n7CXE_CtMGKe3Dmh4KDV7hRHyxSFg37FWx8zBsd7mWpsfkwfOz9yEnaofAxvSBynsg2nJ+qYXxANjUqChS0i+hF+IBccncE3naBw="
}
WG Server connection information
{
"status": "OK",
"server_key": "DpBctA+bwx0wt5p0gmeT/SSr6OMUAtEPWz3Hm6Arfwc=",
"server_port": 1337,
"server_ip": "<IP_ADDRESS>",
"server_vip": "<IP_ADDRESS>",
"peer_ip": "<IP_ADDRESS>",
"peer_pubkey": "ZfgszJw3rMSNEEqauJKuV/PK/nwAzu98RfuBg1Wrc1c=",
"dns_servers": [
"<IP_ADDRESS>",
"<IP_ADDRESS>"
]
}
Saved wireguard server information to /tmp/wg6_piaserverinfo
Saved server_vip to /tmp/wg6_router
@.***:/conf # ./PIAWireguardUS.py debug changeserver
WGInstanceUUID: 82470223-39ae-4ad8-916c-1c4007685235
WGPeerUUID: f5d81fca-a70f-497e-a73a-5ff478a85e1f
WGInstance: DKyi3UIfN5YUXWh+nLV1n42jMgqwnB2mR8Afnw1I1m8=
WGPeer: m7eg7oathAav4UnFVakbc74wrfnskRo2y275c5LmWF4=
Force server change requested
metaServer
CN: newjersey425
IP: <IP_ADDRESS>
wgServer
CN: newjersey425
IP: <IP_ADDRESS>
Your PIA Token (Meta), DO NOT GIVE THIS TO ANYONE
{
"status": "OK",
"token": "VNlp_MLuNsebqjP2iGJFBq_JF4Fa4mtFSPSgmG8BWs8XujHHsa_aBOyDu1eiRXs6Cls4TXI_lGBJ5EO7L0mUBA3m1sLK+qYXB+krSRlH8DkUH9twHCo7jrz53Gs="
}
WG Server connection information
{
"status": "OK",
"server_key": "hPypOkyN7wgfRoVMAJsJe6mFnTAFrwp3VA3kIG4dQHY=",
"server_port": 1337,
"server_ip": "<IP_ADDRESS>",
"server_vip": "<IP_ADDRESS>",
"peer_ip": "<IP_ADDRESS>",
"peer_pubkey": "DKyi3UIfN5YUXWh+nLV1n42jMgqwnB2mR8Afnw1I1m8=",
"dns_servers": [
"<IP_ADDRESS>",
"<IP_ADDRESS>"
]
}
Saved wireguard server information to /tmp/wg7_piaserverinfo
Saved server_vip to /tmp/wg7_router
@.***:/conf #
not better :
image.png (view on web)
https://github.com/FingerlessGlov3s/OPNsensePIAWireguard/assets/39416418/4932e78e-f29a-4cf0-8217-13f4b5cccf42
I use 10.10.x.x and 192.168.0.x and 192.168.229.x for my lan
—
Reply to this email directly, view it on GitHub
https://github.com/FingerlessGlov3s/OPNsensePIAWireguard/issues/8#issuecomment-1876117248,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AC23RNYBS7NXBGHPWWM4LM3YMXUI5AVCNFSM4Z32PG72U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCOBXGYYTCNZSGQ4A
.
You are receiving this because you are subscribed to this thread.Message
ID: @.***>

sneak peak
root@OPNsense:/conf # python3 PIAWireguard.py --debug
DEBUG:JSON validation successful.
DEBUG:Listing OPNsense WG Instances
DEBUG:GET Request: https://<IP_ADDRESS>:443/api/wireguard/server/searchServer/
DEBUG:Starting new HTTPS connection (1): <IP_ADDRESS>:443
DEBUG:https://<IP_ADDRESS>:443 "GET /api/wireguard/server/searchServer/ HTTP/1.1" 200 547
DEBUG:Creating/Populating Wireguard Instances array
DEBUG:Setting up python script for instance london
DEBUG:Getting WireGuard instance
DEBUG:GET Request: https://<IP_ADDRESS>:443/api/wireguard/server/getServer/f1ee8c8e-afa2-4d7f-9e9b-fb0e28ebef0c
DEBUG:https://<IP_ADDRESS>:443 "GET /api/wireguard/server/getServer/f1ee8c8e-afa2-4d7f-9e9b-fb0e28ebef0c HTTP/1.1" 200 559
DEBUG:Getting peer details (PIA's Server)
DEBUG:GET Request: https://<IP_ADDRESS>:443/api/wireguard/client/getClient/3a107fd7-cf61-46d3-9fb1-32afac205342
DEBUG:https://<IP_ADDRESS>:443 "GET /api/wireguard/client/getClient/3a107fd7-cf61-46d3-9fb1-32afac205342 HTTP/1.1" 200 421
DEBUG:Setup london instance in OPNsense
DEBUG:Setting up python script for instance paris
DEBUG:Getting WireGuard instance
DEBUG:GET Request: https://<IP_ADDRESS>:443/api/wireguard/server/getServer/ff0193bc-0419-4d70-bf36-09246af484b1
DEBUG:https://<IP_ADDRESS>:443 "GET /api/wireguard/server/getServer/ff0193bc-0419-4d70-bf36-09246af484b1 HTTP/1.1" 200 560
DEBUG:Getting peer details (PIA's Server)
DEBUG:GET Request: https://<IP_ADDRESS>:443/api/wireguard/client/getClient/c2555c04-03c3-4c8b-a6cd-e7a9175f714c
DEBUG:https://<IP_ADDRESS>:443 "GET /api/wireguard/client/getClient/c2555c04-03c3-4c8b-a6cd-e7a9175f714c HTTP/1.1" 200 421
DEBUG:Setup paris instance in OPNsense
DEBUG:Checking handshakes
DEBUG:GET Request: https://<IP_ADDRESS>:443/api/wireguard/service/show/
DEBUG:https://<IP_ADDRESS>:443 "GET /api/wireguard/service/show/ HTTP/1.1" 200 1044
DEBUG:london tunnel up - last handshake 55 seconds ago
DEBUG:paris tunnel up - last handshake 5 seconds ago
DEBUG:No tunnels need attention
root@OPNsense:/conf # python3 PIAWireguard.py --help
usage: PIAWireguard.py [-h] [--debug] [--listregions] [--changeserver [CHANGESERVER]]

Python script to automate connections to PIA's WireGuard Servers. Source: https://github.com/FingerlessGlov3s/OPNsensePIAWireguard

optional arguments:
  -h, --help            show this help message and exit
  --debug               Enable debug logging
  --listregions         List available regions
  --changeserver [CHANGESERVER]
                        change server for instance name

Looks promising!

I've published the updated script, won't make it a release until I know it's working correctly, I've done a lot of testing in the last 18 hours of working on it. Only thing I couldn't test was Dedicated IPs.
See upgrading part of the readme for upgrade instructions, and also read through the install guide, to see how to configure the updated json config file.

Supports Multiple Instances (Tunnels)
Checks for gateway IP conflicts and skips configuring tunnel, will attempt again on next run if tunnel is down or force change specified
Gateway monitoring update fixes

@delta-whiplash this should fix your issues with conflicting IPs, as it now detects that.
Changes are in main branch as usual
https://github.com/FingerlessGlov3s/OPNsensePIAWireguard

Cool, thanks Glov3s!
I'll try and give it a go over the weekend with my three connections and report back.
Cheers

I've published the updated script, won't make it a release until I know it's working correctly, I've done a lot of testing in the last 18 hours of working on it. Only thing I couldn't test was Dedicated IPs.
See upgrading part of the readme for upgrade instructions, and also read through the install guide, to see how to configure the updated json config file.

Supports Multiple Instances (Tunnels)
Checks for gateway IP conflicts and skips configuring tunnel, will attempt again on next run if tunnel is down or force change specified
Gateway monitoring update fixes

@delta-whiplash this should fix your issues with conflicting IPs, as it now detects that.
Changes are in main branch as usual
https://github.com/FingerlessGlov3s/OPNsensePIAWireguard

Okey am gonna try this Sunday when I will be a bit available thank you for all your job

Cool, thanks Glov3s!
I'll try and give it a go over the weekend with my three connections and report back.
Cheers

What server/country are you using rn ?

What server/country are you using rn ?

UK, Netherlands (with port forwarding) and New York.

Hello everyone, what's your verdict?

Hello everyone, what's your verdict?

I've fixed a few bugs since my comment, but I think I've squashed them all now 🤔

Hello everyone, what's your verdict?

I've fixed a few bugs since my comment, but I think I've squashed them all now 🤔

Okey am gonna try to deploy it today or tomorrow
Do you have some sort of migration guide ?

See the Updating section on the README, I've put the steps in there.

Not had a chance yet since been tied up all day.
Might get a chance later, but failing that I'll try at some point tomorrow!
Sorry!

Reopened as it should be and waiting feedback 😊

Ah, the port alias cannot have hyphens in it, so that explains that.
I'm not sure it's being updated though...

Ah, the port alias cannot have hyphens in it, so that explains that.
I'm not sure it's being updated though...
Edit: Ignore me. Just forced a changeserver on the port forwarded one and it's updated.
So, all good from me!
Cheers

Thanks for the testing, yeah sadly can't have hyphens which is annoying 😅. Guess there's a legacy reason of not being able to use them before they started using guids.
Port aliases have always changed for me, so it should be ok. If you do find an issue with it updating let me know.
Hopefully others will have good success with this new update.

Okey
I stopped two of my firewalls with the new version
and it's week without any bug or disconnection so for me it's stable
Thank you so much @FingerlessGlov3s for this great job and your reactivity

Thank you mate ! I am also using it since almost a week and it looks to be working so far thanks !

Now that the  script supports multiple instances, I'm trying to configure two alternative gateways on my Opnsense router.  Both Wireguard instances have apparently connected properly, but when I add a gateway using the wg1 instance, that gateway will not come online.  I've used the same settings for the wg1 gateway as for wg0.
I'm not a networking expert by any means, so I've probably missed something obvious.  What am I doing wrong?
I'd really appreciate any help.

I'm seeing this:

Try forcing a serverchange on the houston tunnel, see if that brings it up.
./PIAWireguard.py --changeserver houston --debug

Thanks for the quick response!  Tried your suggestion of forcing serverchange.  The gateway still shows "offline", and the same error shows up in the gateway logs.  So, unfortunately, that didn't help.

Looks like your not getting a handshake on a second look of your screenshot, are you still not getting a handshake now it changed server?
You should see a handshake where the redline is.

Probably a connectivity issue between you and the server. Maybe try changing the location to a different US state.

Ok, I tried changing the "Houston" instance in PIAWireguard.json to reference "us_chicago", and then "us_denver".  Got the same result both times.  Before trying multiple instances, I've used all of these successfully.  So I don't think those PIA servers are down.  The error is staying with the wg1 interface regardless of what PIA region is selected.    Weird, huh?

Go to System: Routes: Status and change it to show 100 entries at a time, and if you could screenshot that in here that would be very useful. Wonder if the routing isn't right.

Here you go:

go to VPN: WireGuard: Settings and get the houston peer IP address.
Then open the SSH connection to  OPNsense again, and run the below two commands, lets see what kind of connectivity we have.
traceroute -I IPHERE
curl --insecure https://IPHERE:1337

root@OPNsense:/conf # traceroute -I <IP_ADDRESS>
traceroute to <IP_ADDRESS> (<IP_ADDRESS>), 64 hops max, 48 byte packets
1  <IP_ADDRESS> (<IP_ADDRESS>)  8.231 ms  4.834 ms  8.266 ms
2  96-2-129-225-static.midco.net (<IP_ADDRESS>)  7.359 ms  19.763 ms  12.621 ms
3  24-124-33-17-static.midco.net (<IP_ADDRESS>)  11.758 ms  11.087 ms  4.241 ms
4  kanc-b2-link.ip.twelve99.net (<IP_ADDRESS>)  9.659 ms  9.171 ms  9.761 ms
5  kanc-bb2-link.ip.twelve99.net (<IP_ADDRESS>)  9.982 ms * *
6  * * dls-bb2-link.ip.twelve99.net (<IP_ADDRESS>)  24.044 ms
7  dls-b23-link.ip.twelve99.net (<IP_ADDRESS>)  21.431 ms  18.844 ms  32.246 ms
8  * * *
9  be2763.ccr31.dfw01.atlas.cogentco.com (<IP_ADDRESS>)  19.350 ms  19.521 ms  63.571 ms
10  be2432.ccr21.mci01.atlas.cogentco.com (<IP_ADDRESS>)  46.021 ms  41.444 ms  34.641 ms
11  be3035.ccr21.den01.atlas.cogentco.com (<IP_ADDRESS>)  31.790 ms  36.055 ms  32.047 ms
12  be2616.rcr61.b006544-0.den01.atlas.cogentco.com (<IP_ADDRESS>)  34.493 ms  42.352 ms  34.493 ms
13  <IP_ADDRESS> (<IP_ADDRESS>)  30.172 ms  29.069 ms  28.922 ms
root@OPNsense:/conf # curl --insecure https://<IP_ADDRESS>:1337
404 page not found

Can you screenshot me your VPN: WireGuard: Settings interfaces section please. As you do have connectivity but some reason your not getting a handshake 🤔
I also assume you on 23.7.10 or newer.

The port number on each instance must be unique, increase one of them by one.
Then rerun the script telling it to change the server and it'll spring into life I reckon.

No change, unfortunately.
"instances": {
"Houston": {
"regionId": "us_houston",
"dipToken": "",
"dip": false,
"portForward": false,
"opnsenseWGPort": "51815"
},
"UK2": {
"regionId": "uk_2",
"dipToken": "",
"dip": false,
"portForward": false,
"opnsenseWGPort": "51816"
}

Did it reflect the new port on the webui as well?
If not update it yourself and I'll fix it in the script tomorrow.

Bingo!  When I changed the port manually in the webui, both gateways came up!  Thanks for all your work on this!  Have a great evening.

No problem, enjoy.
Shall get that fix tomorrow if I remember.

I think this just requires a couple of changes to the documentation -- maybe showing an example of PIAWireguard.json with multiple instances (so the syntax is clear), and stating that the port numbers must be incremented for each instance.  I'd also add examples of the command syntax, showing how to use the script with "changeserver" to change one instance or multiple instances.  If you're feeling energetic, though, I suppose the script could check and throw an error message if two or more instances use the same port number.

Or...is there any reason to make the port numbers user-selectable in PIAWireguard.json?  Maybe the script should just assign port numbers that work.

Or...is there any reason to make the port numbers user-selectable in PIAWireguard.json? Maybe the script should just assign port numbers that work.
I don't know what ports you maybe already using or avoiding for WireGuard or other OPNsense services. I'll be adding duplicate port checking, when it validates the config structure and values, to report back it's not valid.

requires a couple of changes to the documentation
The documentation does say "opnsenseWGPort outgoing port for OPNsense, this needs to be different for each tunnel and not already be in use for something else on OPNsense" on step 4.
The process of following the steps tells you the configuration, and command arguments, but you can also do --help on the script, and it tells you the arguments as well. --help isn't documented as that's new within tha last few weeks after the rewrite, which isn't offically released as stable yet. Looking to iron out issues like you one you had where it let you have duplicate ports, before I push a stable release. I shall add a arguments section though.

I will also fix the bug it doesn't update the port after you've changed it, as that should ideally happen for consistency

I think the non-updating of the port may have been user error on my part (not surprisingly).  When I ran the script again with the region argument supplied, I think it did update the port.

Added argument section to README and added checks for the duplicate port
https://github.com/FingerlessGlov3s/OPNsensePIAWireguard/commit/80306b367f0f58226c0c3e690fe9029b25a5f318

Perfect!  Thanks again for all the skill and effort you put into this.

just to add to this real quick, I've reinstalled the script (followed the upgrade procedure, but since so much stuff changed I basically started over half-way though and just followed the fresh install tutorial and adjusted stuff as necessary).
Works flawlessly.
Also: "Note: I have not tested DIP in a while, so if this works for you let me know, if not create a GitHub issue."
-> works without a problem.
Thanks a lot for your work.

@FingerlessGlov3s many thanks for the great work, really appreciate it! Upgrade works like a charm.

Support has been added and I feel it's now mature enough to call it stable.


Ceedling unit tests will not execute on windows

We I follow the instructions in the README (Alternate Installation for Those Planning to Be Ceedling Developers) to run the unit tests they abort with 'please try gem install win32api'. When I try the gem fails to install. I would have expected this to be installed as part of bundle installer, but if there is a dependency on a gem that no longer exists there may be a larger issue at hand

Hi. We're working on the next release which resolves this (and a number of other bugs). You can see that gem in the releases folder. At the moment, you'd have to download the gem and install it manually... but it will be fixing the issues mentioned.

Looking forward to the new release!
When I install win32api, I now get the following errors:
`PS C:\dev\GitRepos\Ceedling> bundle exec rake
C:/ruby30-x64/bin/ruby.exe -I'C:/ruby30-x64/lib/ruby/gems/3.0.0/gems/rspec-core-3.8.0/lib';'C:/ruby30-x64/lib/ruby/gems/
3.0.0/gems/rspec-support-3.8.0/lib' 'C:/ruby30-x64/lib/ruby/gems/3.0.0/gems/rspec-core-3.8.0/exe/rspec' --pattern 'spec/
/_spec.rb'
..............*.......F.....................F............................................FF.......................
........................................................................................................................
............
Pending: (Failures listed here are expected and do not affect your suite's status)

ConfiguratorBuilder is scary
Temporarily skipped with xit
./spec/configurator_builder_spec.rb:6

ConfiguratorHelper doesn't exist...
Temporarily skipped with xit
./spec/configurator_helper_spec.rb:4

Configurator#standardize_paths should standardize [:project][:build_root]
Temporarily skipped with xit
./spec/configurator_spec.rb:5

Configurator#standardize_paths should standardize [:paths]
Temporarily skipped with xit
./spec/configurator_spec.rb:6

Configurator#standardize_paths should standardize [:files]
Temporarily skipped with xit
./spec/configurator_spec.rb:7

Configurator#standardize_paths should standardize [:tools]
Temporarily skipped with xit
./spec/configurator_spec.rb:8

FileFinderHelper#find_file_in_collection handles duplicate files
Temporarily skipped with xit
./spec/file_finder_helper_spec.rb:26

uncategorized set_verbosity needs to be defined
Temporarily skipped with xit
./spec/uncatagorized_specs_spec.rb:6

Failures:

Ceedling Gcov basic operations should match 255
Failure/Error: expect($?.exitstatus).to match(255) # Since a test fails, we return error here
expected nil to match 255
./spec/gcov/gcov_test_cases_spec.rb:100:in `block (2 levels) in can_test_projects_with_gcov_with_fail_because_of_

uncovered_files'
# ./spec/gcov/gcov_test_cases_spec.rb:91:in chdir'      # ./spec/gcov/gcov_test_cases_spec.rb:91:in block in can_test_projects_with_gcov_with_fail_because_of_uncovered_fi
les'
# ./spec/spec_system_helper.rb:108:in block (2 levels) in with_context'      # ./spec/spec_system_helper.rb:141:in with_constrained_env'
# ./spec/spec_system_helper.rb:104:in block in with_context'      # ./spec/spec_system_helper.rb:103:in chdir'
# ./spec/spec_system_helper.rb:103:in with_context'      # ./spec/gcov/gcov_test_cases_spec.rb:90:in can_test_projects_with_gcov_with_fail_because_of_uncovered_files'
# ./spec/gcov/gcov_deployment_spec.rb:29:in `block (4 levels) in <top (required)>'

GeneratorTestResults#process_and_write_results handles a mangled test output as gracefully as it can
Failure/Error: expect(IO.read(TEST_OUT_FILE)).to eq(IO.read('spec/support/test_example_mangled.pass'))
expected: "---\n:source:\n  :file: some/place/test_example.c\n  :dirname: some/place\n  :basename: test_example..
.red: 0\n:stdout:\n- Verbose output one\n- test_example.c:269:test_tVerbous output two\n:time: 0.0\n"
got: "---\n:source:\n  :file: some/place/test_example.c\n  :dirname: some/place\n  :basename: test_example..
.red: 0\n:stdout:\n- Verbose output one\n- test_example.c:269:test_tVerbous output two\n:time: 0.0\n"
(compared using ==)
Diff:
@@ -8,7 +8,7 @@
:line: 257
:message: ''
:unity_test_time: 0
+-
:failures: []
:ignores: []
:counts:
./spec/generator_test_results_spec.rb:103:in `block (3 levels) in <top (required)>'

Ceedling deployed in a project's vendor directory. should match /Segmentation fault (core dumped)/
Failure/Error: expect(output).to match(/Segmentation fault (core dumped)/)
expected "NOTICE: \nThe option[s]:  \ncannot be applied.To enable it, please add :cmdline_args under :test_r...
race)\n\n--------------------\nOVERALL TEST SUMMARY\n--------------------\n\nNo tests executed.\n\n" to match /Segmentat
ion fault (core dumped)/
Diff:
@@ -1,2 +1,44 @@
-/Segmentation fault (core dumped)/
+NOTICE:
+The option[s]:
+cannot be applied.To enable it, please add :cmdline_args under :test_runner option in your project.yml.
+
+
+Test 'test/test_example_file_sigsegv.c'
+---------------------------------------
+Generating runner for test_example_file_sigsegv.c...
+Compiling test_example_file_sigsegv_runner.c...
+Compiling test_example_file_sigsegv.c...
+Compiling unity.c...
+Compiling example_file.c...
+Compiling cmock.c...
+Linking test_example_file_sigsegv.out...
+Running test_example_file_sigsegv.out...
+
+ERROR: Test executable "test_example_file_sigsegv.out" failed.
+> Produced no final test result counts in $stdout:
+test_example_file_sigsegv.c:9:test_add_numbers_adds_numbers:PASS
+> And exited with status: [0] (count of failed tests).
+> This is often a symptom of a bad memory access in source or test code.
+
+rake aborted!
+
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/generator
_helper.rb:36:in test_results_error_handler'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/generator .rb:188:in generate_test_results'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/rules_tes
ts.rake:55:in block in <top (required)>'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/task_invo ker.rb:107:in invoke_test_results'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/test_invo
ker.rb:125:in block in setup_and_invoke'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/test_invo ker.rb:51:in setup_and_invoke'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/tasks_tes
ts.rake:13:in block (2 levels) in <top (required)>'   +C:/dev/GitRepos/Ceedling/bin/ceedling:359:in block in <top (required)>'
+C:/dev/GitRepos/Ceedling/bin/ceedling:346:in <top (required)>'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/gems/ruby/3.0.0/bin/ceedling:25:in load'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/gems/ruby/3.0.0/bin/ceedling:25:in `'
+Tasks: TOP => build/test/results/test_example_file_sigsegv.pass
+(See full trace by running task with --trace)
+
+--------------------
+OVERALL TEST SUMMARY
+--------------------
+
+No tests executed.
./spec/spec_system_helper.rb:842:in `block (2 levels) in test_run_of_projects_fail_because_of_sigsegv_without_rep

ort'
# ./spec/spec_system_helper.rb:835:in chdir'      # ./spec/spec_system_helper.rb:835:in block in test_run_of_projects_fail_because_of_sigsegv_without_report'
# ./spec/spec_system_helper.rb:108:in block (2 levels) in with_context'      # ./spec/spec_system_helper.rb:141:in with_constrained_env'
# ./spec/spec_system_helper.rb:104:in block in with_context'      # ./spec/spec_system_helper.rb:103:in chdir'
# ./spec/spec_system_helper.rb:103:in with_context'      # ./spec/spec_system_helper.rb:834:in test_run_of_projects_fail_because_of_sigsegv_without_report'
# ./spec/system/deployment_spec.rb:51:in `block (3 levels) in <top (required)>'

Ceedling deployed in a project's vendor directory. should match /Program received signal SIGSEGV, Segmentation fa
ult./
Failure/Error: expect(output).to match(/Program received signal SIGSEGV, Segmentation fault./)
expected "NOTICE: \nThe option[s]:  \ncannot be applied.To enable it, please add :cmdline_args under :test_r...
race)\n\n--------------------\nOVERALL TEST SUMMARY\n--------------------\n\nNo tests executed.\n\n" to match /Program r
eceived signal SIGSEGV, Segmentation fault./
Diff:
@@ -1,2 +1,44 @@
-/Program received signal SIGSEGV, Segmentation fault./
+NOTICE:
+The option[s]:
+cannot be applied.To enable it, please add :cmdline_args under :test_runner option in your project.yml.
+
+
+Test 'test/test_example_file_sigsegv.c'
+---------------------------------------
+Generating runner for test_example_file_sigsegv.c...
+Compiling test_example_file_sigsegv_runner.c...
+Compiling test_example_file_sigsegv.c...
+Compiling unity.c...
+Compiling example_file.c...
+Compiling cmock.c...
+Linking test_example_file_sigsegv.out...
+Running test_example_file_sigsegv.out...
+
+ERROR: Test executable "test_example_file_sigsegv.out" failed.
+> Produced no final test result counts in $stdout:
+test_example_file_sigsegv.c:9:test_add_numbers_adds_numbers:PASS
+> And exited with status: [0] (count of failed tests).
+> This is often a symptom of a bad memory access in source or test code.
+
+rake aborted!
+
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/generator
_helper.rb:36:in test_results_error_handler'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/generator .rb:188:in generate_test_results'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/rules_tes
ts.rake:55:in block in <top (required)>'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/task_invo ker.rb:107:in invoke_test_results'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/test_invo
ker.rb:125:in block in setup_and_invoke'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/test_invo ker.rb:51:in setup_and_invoke'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/fake_project/vendor/ceedling/lib/ceedling/tasks_tes
ts.rake:13:in block (2 levels) in <top (required)>'   +C:/dev/GitRepos/Ceedling/bin/ceedling:359:in block in <top (required)>'
+C:/dev/GitRepos/Ceedling/bin/ceedling:346:in <top (required)>'   +C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/gems/ruby/3.0.0/bin/ceedling:25:in load'
+C:/Users/ADMINI~1/AppData/Local/Temp/2/d20230731-6660-wjrz6t/gems/ruby/3.0.0/bin/ceedling:25:in `'
+Tasks: TOP => build/test/results/test_example_file_sigsegv.pass
+(See full trace by running task with --trace)
+
+--------------------
+OVERALL TEST SUMMARY
+--------------------
+
+No tests executed.
./spec/spec_system_helper.rb:875:in `block (2 levels) in test_run_of_projects_fail_because_of_sigsegv_with_report

'
# ./spec/spec_system_helper.rb:851:in chdir'      # ./spec/spec_system_helper.rb:851:in block in test_run_of_projects_fail_because_of_sigsegv_with_report'
# ./spec/spec_system_helper.rb:108:in block (2 levels) in with_context'      # ./spec/spec_system_helper.rb:141:in with_constrained_env'
# ./spec/spec_system_helper.rb:104:in block in with_context'      # ./spec/spec_system_helper.rb:103:in chdir'
# ./spec/spec_system_helper.rb:103:in with_context'      # ./spec/spec_system_helper.rb:850:in test_run_of_projects_fail_because_of_sigsegv_with_report'
# ./spec/system/deployment_spec.rb:52:in `block (3 levels) in <top (required)>'
Finished in 12 minutes 7 seconds (files took 0.47357 seconds to load)
253 examples, 4 failures, 8 pending
Failed examples:
rspec ./spec/gcov/gcov_deployment_spec.rb:29 # Ceedling Gcov basic operations should match 255
rspec ./spec/generator_test_results_spec.rb:101 # GeneratorTestResults#process_and_write_results handles a mangled test
output as gracefully as it can
rspec ./spec/system/deployment_spec.rb:51 # Ceedling deployed in a project's vendor directory. should match /Segmentat
ion fault (core dumped)/
rspec ./spec/system/deployment_spec.rb:52 # Ceedling deployed in a project's vendor directory. should match /Program r
eceived signal SIGSEGV, Segmentation fault./
C:/ruby30-x64/bin/ruby.exe -I'C:/ruby30-x64/lib/ruby/gems/3.0.0/gems/rspec-core-3.8.0/lib';'C:/ruby30-x64/lib/ruby/gems/
3.0.0/gems/rspec-support-3.8.0/lib' 'C:/ruby30-x64/lib/ruby/gems/3.0.0/gems/rspec-core-3.8.0/exe/rspec' --pattern 'spec/
**/*_spec.rb' failed
PS C:\dev\GitRepos\Ceedling>`


feat: introduce basic ssl connection

I hereby agree to the terms of the Singularity Data, Inc. Contributor License Agreement.
What's changed and what's your intention?
Security and SSL is a big topic and may involves a lot tasks. This PR just finishes the very basic function.
For test
./risedev p
psql -p 4566 -d dev -h localhost -U root --set=sslmode=verify-full
You can see that
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
For code
Build up needed Ssl context when protocol set up, and turn this context into ssl stream when received ssl request.
Add a Conn enum to wrap up Unencrypted and encrypted. Simply static dispatch the method call.
Self-signed CA cert and key for tests under test folder for e2e test.
Checklist

[x] I have written necessary rustdoc comments
[x] I have added necessary unit tests and integration tests
[x] All checks passed in ./risedev check (or alias, ./risedev c)

Documentation
If your pull request contains user-facing changes, please specify the types of the changes, and create a release note. Otherwise, please feel free to remove this section.
Types of user-facing changes
Please keep the types that apply to your changes, and remove those that do not apply.

Installation and deployment
Connector (sources & sinks)
SQL commands, functions, and operators
RisingWave cluster configuration changes
Other (please specify in the release note below)

Release note
Please create a release note for your changes. In the release note, focus on the impact on users, and mention the environment or conditions where the impact may occur.
Refer to a related PR or issue link (optional)
ref #5604

thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: ErrorStack([Error { code: 33558530, library: "system library", function: "fopen", reason: "No such file or directory", file: "crypto/bio/bss_file.c", line: 288, data: "fopen('src/utils/pgwire/tests/ssl/demo.key','r')" }, Error { code: 537346050, library: "BIO routines", function: "file_ctrl", reason: "system lib", file: "crypto/bio/bss_file.c", line: 290 }, Error { code: 336265218, library: "SSL routines", function: "SSL_CTX_use_PrivateKey_file", reason: "system lib", file: "ssl/ssl_rsa.c", line: 521 }])', src/utils/pgwire/src/pg_protocol.rs:767:10
--
  | note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
  | note: run with `MADSIM_TEST_SEED=1665763720914771120` environment variable to reproduce this error
  | and make sure `MADSIM_CONFIG_HASH=1AD2E4ABC41F3553`

<br class="Apple-interchange-newline" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;">

Probably need static link for building RisingWave in order not to open dynamic libraries?

Need to ignore this case from deterministic simulation, or support open files. cc @wangrunji0408 Thanks for looking into this.

I found this error only occurs in deterministic scaling test, the other two deterministic test tasks are passed. So could the reason be that the scaling test runs on a different working directory? cc @BugenZhao

Sounds great!

So could the reason be that the scaling test runs on a different working directory?

Oops. It's possible. I archive the unit tests with nextest in the build phase and I'm not sure where they will be extracted and run. 🤔

As the key and cert are hard-coded now and not production ready, can we encode them in the program and use tempfile in runtime? So we don't need to worry about the working directory. For example, user may find RisingWave can't work if they want to manually run it in a different working directory.

Actually I can just turn the do not read file into an error so that non-e2e-test will not have ssl connection. After investigating, I think this is the most convenient way to bypass this problem.

As the key and cert are hard-coded now and not production ready, can we encode them in the program and use tempfile in runtime? So we don't need to worry about the working directory. For example, user may find RisingWave can't work if they want to manually run it in a different working directory.

Thanks for sharing. I will investigate this.

The root cause is cargo run/cargo test will start from the closet Cargo.toml root, while the hard code start from project root. So I think moving tests folder can only temporailly solve this, we need to find a better way.


docs: Fix builder links

Updates the links on the builder's index page to link to the correct pages. They currently link to the scala builders.

@terakilobyte closing this as the docs have been moved out of the driver repo.


https://github.com/yiisoft/demo/issues/562

This file is necessary in order for yiisoft/yii-cycle and rossaddison/yii3-i to work. See #562, and also for the yiisoft/demo blog to work. The EntityReader under yiisoft/yii-cycle has a namespace pointing to a non-existent file.

Need adapt yiisoft/yii-cycle for released version of yiisoft/data.
See https://github.com/yiisoft/yii-cycle/issues/150.


Does formatting uncertain protein change ignore format options?

I've encountered an HGVS string like "p.(Met918Thr)" and the specification says it represents predicated protein change.

in p.(Cys123Gly) indicating the amino acid change is predicted from DNA level data (no experimental proof)

It looks like this "()" disrupts formatting like below.
dev> (hgvs/format (hgvs/parse "p.(Met918Thr)")
                  {:amino-acid-format :short})
"p.(Met918Thr)"
dev> (hgvs/format (hgvs/parse "p.Met918Thr")
                  {:amino-acid-format :short})
"p.M918T"

Is it intended?

Not intended. That is a bug. I will fix it soon. Thank you for reporting. 🙇


fix: #61 add screenreader support for password copy buttons

Each password copy button with have a screen reader label of "Copy Password#n"

Hi @hepabolu - this is to get the "controversial" password copy buttons to play nice with screen readers and make @podfeet  happy ;)

I added this to the copy button issue as well - there are newly introduced VoiceOver errors in this latest implementation. I made a video to show you where they are:
https://share.cleanshot.com/Smh9VHbQ

🤦♂maybe we should have @podfeet do the next review 😉

Submitted #63 for the issues @podfeet identified


RootViz card viz not responsive (enough)

Fixed as of https://github.com/dfst/deepforge/commit/11f77518430759ff429b388f7db5a5fc0d6f3c9c


Various minor updates and fixes

Summary

Unlike PR #33 and PR #34, I don't think these fix issues that would prevent
anyone from completing the tutorial. Mostly the changes update versions, remove
hardcoded go versions and make the commands easier to copy-paste and follow.
Ticket Link

N/A
Release Note

NONE

Thanks @jhrozek , sorry for taking so long to view this and thanks for working on it.


envoy: Update to use source port in connection pool hash

Update Envoy image to a version that includes the source port in upstream connection pool hash, so that each unique downstream connection gets a dedicated upstream connection.
Backport note: Backport once the cilium/proxy change is backported to the relevant release branches (cilium/proxy v1.27 & v1.28)
Fixes: #27762
Envoy upstream connections are now unique for each downstream connection when using the original source address of a source pod.

/test

/test

/test

Rebased to resolve conflict in git diff context.

/test


Migrate to Go 1.18

Kubebuilder now supports Go 1.18. With this, it might be a good time to update both the operator and flagd to 1.18. I'm particularly excited for the possibility of using generics to greatly simplify flagd.

Upgrading to 1.18 is one thing, moving to generics is another.
Let's do some research before we just jump to generics because they are new. Templating in C++ is an absolute nightmare to debug. I am not against it but think we need to have some solid research and examples of what we want to replace.

https://github.com/open-feature/flagd/pull/59/ this should enable 1.18

I think this one is already handled. @AlexsJones @toddbaert


InvalidRequirement when installing apache airflow with gcp_api extra

[x] I am on the latest Poetry version.
[x] I have searched the issues of this repo and believe that this is not a duplicate.
[x] If an exception occurs when executing a command, I executed it again in debug mode (-vvv option).

Poetry
Version: 1.0.0a2
Python:  3.6.6

Virtualenv
Python:         3.6.6
Implementation: CPython
Path:           /Users/benjamin/.pyenv/versions/3.6.6/envs/poetry
Valid:          True

System
Platform: darwin
OS:       posix
Python:   /Users/benjamin/.pyenv/versions/3.6.6

Issue
# On a clean virtualenv
$ poetry add apache-airflow --extras gcp_api -v

Using virtualenv: /Users/benjamin/.pyenv/versions/3.6.6/envs/poetry
Using version ^1.10 for apache-airflow

Updating dependencies
Resolving dependencies... (1.3s)

[InvalidRequirement]
Invalid requirement, parse error at "'; <empty'"

Traceback (most recent call last):
  File "/Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/clikit/console_application.py", line 131, in run
    status_code = command.handle(parsed_args, io)
  File "/Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/clikit/api/command/command.py", line 112, in handle
    status_code = self._do_handle(args, io)
  File "/Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/clikit/api/command/command.py", line 160, in _do_handle
    return getattr(handler, handler_method)(args, io, self)
  File "/Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/cleo/commands/command.py", line 92, in wrap_handle
    return self.handle()
  File "/Users/benjamin/.poetry/lib/poetry/console/commands/add.py", line 135, in handle
    status = installer.run()
  File "/Users/benjamin/.poetry/lib/poetry/installation/installer.py", line 74, in run
    self._do_install(local_repo)
  File "/Users/benjamin/.poetry/lib/poetry/installation/installer.py", line 214, in _do_install
    ops = solver.solve(use_latest=whitelist)
  File "/Users/benjamin/.poetry/lib/poetry/puzzle/solver.py", line 38, in solve
    packages, depths = self._solve(use_latest=use_latest)
  File "/Users/benjamin/.poetry/lib/poetry/puzzle/solver.py", line 171, in _solve
    self._package, self._provider, locked=locked, use_latest=use_latest
  File "/Users/benjamin/.poetry/lib/poetry/mixology/__init__.py", line 7, in resolve_version
    return solver.solve()
  File "/Users/benjamin/.poetry/lib/poetry/mixology/version_solver.py", line 79, in solve
    next = self._choose_package_version()
  File "/Users/benjamin/.poetry/lib/poetry/mixology/version_solver.py", line 380, in _choose_package_version
    for incompatibility in self._provider.incompatibilities_for(version):
  File "/Users/benjamin/.poetry/lib/poetry/puzzle/provider.py", line 435, in incompatibilities_for
    for dep in dependencies
  File "/Users/benjamin/.poetry/lib/poetry/puzzle/provider.py", line 435, in <listcomp>
    for dep in dependencies
  File "/Users/benjamin/.poetry/lib/poetry/packages/package.py", line 346, in to_dependency
    return dependency_from_pep_508(name)
  File "/Users/benjamin/.poetry/lib/poetry/packages/__init__.py", line 34, in dependency_from_pep_508
    req = Requirement(name)
  File "/Users/benjamin/.poetry/lib/poetry/version/requirements.py", line 202, in __init__
    requirement_string[e.loc : e.loc + 8]

keyboard is the one I've ran into the problem with. Has the dependency: pyobjc; sys_platform=='darwin'
Guessing it's a failure to fully implement PEP 508.

I saw the same error when trying to add poetry add pyobjc to my project, as @Pluckerpluck also pointed out. For now I installed it using pip, but I would appreciate an update whenever it is convenient for you @sdispater.

This should be fixed in the latest 0.12.12 release

@sdispater sadly I still seem to have the bug using 0.12.12.
poetry debug:info

Poetry
======

 * Version: 0.12.12
 * Python:  3.6.6

Virtualenv
==========

 * Python:         3.6.6
 * Implementation: CPython
 * Path:           /Users/benjamin/Dev/playground/test/.venv
 * Valid:          True

System
======

 * Platform: darwin
 * OS:       posix
 * Python:   /Users/benjamin/.pyenv/versions/3.6.6

poetry add apache-airflow --extras gcp_api -v --dev

Using virtualenv: /Users/benjamin/Dev/playground/test/.venv
Using version ^1.10 for apache-airflow

Updating dependencies
Resolving dependencies... (0.0s)

[InvalidRequirement]
Invalid requirement, parse error at "'; <empty'"

Exception trace:
 /Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/cleo/application.py in run() at line 94
   status_code = self.do_run(input_, output_)
 /Users/benjamin/.poetry/lib/poetry/console/application.py in do_run() at line 88
   return super(Application, self).do_run(i, o)
 /Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/cleo/application.py in do_run() at line 197
   status_code = command.run(input_, output_)
 /Users/benjamin/.poetry/lib/poetry/console/commands/command.py in run() at line 77
   return super(BaseCommand, self).run(i, o)
 /Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/cleo/commands/base_command.py in run() at line 146
   status_code = self.execute(input_, output_)
 /Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/cleo/commands/command.py in execute() at line 107
   return self.handle()
 /Users/benjamin/.poetry/lib/poetry/console/commands/add.py in handle() at line 139
   status = installer.run()
 /Users/benjamin/.poetry/lib/poetry/installation/installer.py in run() at line 73
   self._do_install(local_repo)
 /Users/benjamin/.poetry/lib/poetry/installation/installer.py in _do_install() at line 165
   ops = solver.solve(use_latest=self._whitelist)
 /Users/benjamin/.poetry/lib/poetry/puzzle/solver.py in solve() at line 38
   packages, depths = self._solve(use_latest=use_latest)
 /Users/benjamin/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 167
   locked[package.name] = DependencyPackage(package.to_dependency(), package)
 /Users/benjamin/.poetry/lib/poetry/packages/package.py in to_dependency() at line 346
   return dependency_from_pep_508(name)
 /Users/benjamin/.poetry/lib/poetry/packages/__init__.py in dependency_from_pep_508() at line 35
   req = Requirement(name)
 /Users/benjamin/.poetry/lib/poetry/version/requirements.py in __init__() at line 202
   requirement_string[e.loc : e.loc + 8]

Hitting same issue here when installing pyobjc
[InvalidRequirement]
Invalid requirement, parse error at "'; <empty'"

Exception trace:
 /Users/zach/.poetry/lib/poetry/_vendor/py3.6/cleo/application.py in run() at line 94
   status_code = self.do_run(input_, output_)
 /Users/zach/.poetry/lib/poetry/console/application.py in do_run() at line 88
   return super(Application, self).do_run(i, o)
 /Users/zach/.poetry/lib/poetry/_vendor/py3.6/cleo/application.py in do_run() at line 197
   status_code = command.run(input_, output_)
 /Users/zach/.poetry/lib/poetry/console/commands/command.py in run() at line 77
   return super(BaseCommand, self).run(i, o)
 /Users/zach/.poetry/lib/poetry/_vendor/py3.6/cleo/commands/base_command.py in run() at line 146
   status_code = self.execute(input_, output_)
 /Users/zach/.poetry/lib/poetry/_vendor/py3.6/cleo/commands/command.py in execute() at line 107
   return self.handle()
 /Users/zach/.poetry/lib/poetry/console/commands/add.py in handle() at line 139
   status = installer.run()
 /Users/zach/.poetry/lib/poetry/installation/installer.py in run() at line 76
   self._do_install(local_repo)
 /Users/zach/.poetry/lib/poetry/installation/installer.py in _do_install() at line 216
   ops = solver.solve(use_latest=whitelist)
 /Users/zach/.poetry/lib/poetry/puzzle/solver.py in solve() at line 38
   packages, depths = self._solve(use_latest=use_latest)
 /Users/zach/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 171
   self._package, self._provider, locked=locked, use_latest=use_latest
 /Users/zach/.poetry/lib/poetry/mixology/__init__.py in resolve_version() at line 7
   return solver.solve()
 /Users/zach/.poetry/lib/poetry/mixology/version_solver.py in solve() at line 79
   next = self._choose_package_version()
 /Users/zach/.poetry/lib/poetry/mixology/version_solver.py in _choose_package_version() at line 380
   for incompatibility in self._provider.incompatibilities_for(version):
 /Users/zach/.poetry/lib/poetry/puzzle/provider.py in incompatibilities_for() at line 447
   for dep in dependencies
 /Users/zach/.poetry/lib/poetry/puzzle/provider.py in <listcomp>() at line 447
   for dep in dependencies
 /Users/zach/.poetry/lib/poetry/packages/package.py in to_dependency() at line 346
   return dependency_from_pep_508(name)
 /Users/zach/.poetry/lib/poetry/packages/__init__.py in dependency_from_pep_508() at line 34
   req = Requirement(name)
 /Users/zach/.poetry/lib/poetry/version/requirements.py in __init__() at line 202
   requirement_string[e.loc : e.loc + 8]

@sdispater would you mind reopening this issue as it does not seem to be fixed?

Just to make sure: could anyone of you try again after clearing the cache poetry cache:clear pypi --all to see if this is not due to a cache problem?

I confirm that the problem persists.
poetry debug:info

Poetry
======

 * Version: 0.12.15
 * Python:  3.6.6

Virtualenv
==========

 * Python:         3.6.6
 * Implementation: CPython
 * Path:           /Users/benjamin/Dev/playground/test2/.venv
 * Valid:          True

System
======

 * Platform: darwin
 * OS:       posix
 * Python:   /Users/benjamin/.pyenv/versions/3.6.6

poetry cache:clear pypi --all

Delete 2 entries? (yes/no) [no] yes

poetry add apache-airflow --extras gcp_api -v --dev

Using virtualenv: /Users/benjamin/Dev/playground/test2/.venv
Using version ^1.10 for apache-airflow
Updating dependencies
Resolving dependencies... (0.0s)
[InvalidRequirement]
Invalid requirement, parse error at "'; <empty'"
Exception trace:
/Users/benjamin/.poetry/lib/poetry/vendor/py3.6/cleo/application.py in run() at line 94
status_code = self.do_run(input, output_)
/Users/benjamin/.poetry/lib/poetry/console/application.py in do_run() at line 88
return super(Application, self).do_run(i, o)
/Users/benjamin/.poetry/lib/poetry/vendor/py3.6/cleo/application.py in do_run() at line 197
status_code = command.run(input, output_)
/Users/benjamin/.poetry/lib/poetry/console/commands/command.py in run() at line 77
return super(BaseCommand, self).run(i, o)
/Users/benjamin/.poetry/lib/poetry/vendor/py3.6/cleo/commands/base_command.py in run() at line 146
status_code = self.execute(input, output_)
/Users/benjamin/.poetry/lib/poetry/_vendor/py3.6/cleo/commands/command.py in execute() at line 107
return self.handle()
/Users/benjamin/.poetry/lib/poetry/console/commands/add.py in handle() at line 139
status = installer.run()
/Users/benjamin/.poetry/lib/poetry/installation/installer.py in run() at line 73
self._do_install(local_repo)
/Users/benjamin/.poetry/lib/poetry/installation/installer.py in _do_install() at line 165
ops = solver.solve(use_latest=self._whitelist)
/Users/benjamin/.poetry/lib/poetry/puzzle/solver.py in solve() at line 38
packages, depths = self._solve(use_latest=use_latest)
/Users/benjamin/.poetry/lib/poetry/puzzle/solver.py in _solve() at line 167
locked[package.name] = DependencyPackage(package.to_dependency(), package)
/Users/benjamin/.poetry/lib/poetry/packages/package.py in to_dependency() at line 346
return dependency_from_pep_508(name)
/Users/benjamin/.poetry/lib/poetry/packages/init.py in dependency_from_pep_508() at line 35
req = Requirement(name)
/Users/benjamin/.poetry/lib/poetry/version/requirements.py in init() at line 202
requirement_string[e.loc : e.loc + 8]

@Paikan Thanks! I will investigate.

Here's a part of my poetry.lock file:
[[package]]
category = "dev"
description = "Lightweight, extensible schema and data validation tool for Python dictionaries."
marker = "<empty>"
name = "cerberus"
optional = false
python-versions = ">=2.7"
version = "1.3.1"

It works fine if I remove the marker value and run poetry install.
 [[package]]
 category = "dev"
 description = "Lightweight, extensible schema and data validation tool for Python dictionaries."
-marker = "<empty>"
 name = "cerberus"
 optional = false
 python-versions = ">=2.7"
 version = "1.3.1"

Marker is not emptry, it should read marker = "extra == \"gcp_api\"" if you ran the installation like in the issue: poetry add apache-airflow --extras gcp_api -v
Still an issue:
Poetry
======

 * Version: 0.12.16
 * Python:  3.7.3

Virtualenv
==========

 * Python:         3.7.3
 * Implementation: CPython
 * Path:           /Users/deepio/Documents/GitHub/test2/env
 * Valid:          True

System
======

 * Platform: darwin
 * OS:       posix
 * Python:   /usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7

But my earlier issue with installing pyobjc was fixed. Thank you.

Still an issue, both under 0.12.17 and 1.0.0a4

@sdispater I'd be happy to help looking into this, because this is an issue for me, but I'm not entirely sure what the expected behaviour here is. It seems that what happens is that this line is adding the ; <empty> that cannot be parsed here:
def to_dependency(self):
        from . import dependency_from_pep_508

        name = "{} (=={})".format(self._name, self._version)

        if not self.marker.is_any():
            name += " ; {}".format(str(self.marker))

        return dependency_from_pep_508(name)

In the case of Airflow, the marker is an instance of EmptyMarker. The condition evaluates to True (because EmptyMarker.is_any() returns False), and then the string representation for EmptyMarker (which is <empty>) gets appended. Is that intended?

This seems to be addressed in #1230.

same issue here ...

This should be fixed in the latest 1.0.0b2 prerelease.


Cross-platform Support

Support for Linux, macOS, and Windows, alongside Android and iOS.
This issue may or may not be dependent on #24.

WebGL should also be considered, as this can be uploaded to Unity Play for an improved ease-of-access.

Linux, macOS, and Windows all build successfully, alongside Android and iOS. However, WebGL has a shader-related issue.

This has been resolved by dc7d4ee868b49b77213ab2ae751cc78b9cee99e0; it is now available on Unity Play.
https://play.unity.com/mg/other/seequencer


Generate coverage report even if some tests fail

set -o errexit was exiting run_tests prematurely if any test failed,
so the coverage report was not always generated.
Fixes #523

*slaps forehead* should have called the branch who-covers-the-covermen

I was thinking just last week it's been quite some time since receiving one of your pun branches :) Love it


Error Launching Script

Hi,
on Windows 10 with scribus-1.4.5-windows-x64 (tried also with 1.5.0) and ScribusGenerator-master  trying to launch the script, I get the following:

Traceback (most recent call last):
  File "", line 8, in
  File "E:\users\myusername\Documenti\scribus\ScribusGenerator-master\ScribusGenerator.py", line 341, in
    main_wrapper(sys.argv)
  File "E:\users\myusername\Documenti\scribus\ScribusGenerator-master\ScribusGenerator.py", line 329, in main_wrapper
    main(argv)
  File "E:\users\myusername\Documenti\scribus\ScribusGenerator-master\ScribusGenerator.py", line 318, in main
    dlg = GeneratorDialog(root, ctrl)
  File "E:\users\myusername\Documenti\scribus\ScribusGenerator-master\ScribusGenerator.py", line 197, in __init__
    self.__ico=PhotoImage(file=self.__pluginDir+'/pic/ScribusGenerator_logo.png')
  File "C:\Program Files\Scribus 1.4.5\lib\lib-tk\Tkinter.py", line 3323, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Program Files\Scribus 1.4.5\lib\lib-tk\Tkinter.py", line 3279, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
TclError: couldn't recognize data in image file "E:\users\myusername\Documenti\scribus\ScribusGenerator-master/pic/ScribusGenerator_logo.png"

My total ignorance does not allow me to understand a bit of the above.
Thanks in advance,
Frankie

Thank you Frankieit for this feedback, and sorry it did not work instantly for you.
It seemed like png images are not supported in Windows, so I changed it with a gif instead (same image, other format). works for me in Win8.
Kindly re-download Scribus Generator and try again. Hope this is useful to you!
Berteh.

Hi Berteh,
it works like a charm, thank you very much.
F

you're welcome.

Hi again,
last thing I want is to abuse of your kindness but, to make it simple, is
it possible to allow multiple fields on one page?
"Price List style" kind of?

Once more, thank you very much
Francesco
2015-12-09 13:05 GMT+01:00 Berteh<EMAIL_ADDRESS>
you're welcome.
—
Reply to this email directly or view it on GitHub
https://github.com/berteh/ScribusGenerator/issues/34#issuecomment-163203693
.

Hello @frankieit
there's no abuse... I'll let you know if it should get there one day ;)
Just please, next time: open a new issue, as it is on another topic than the error in launching the script we solved.
The topic of multiple fields interests me a lot. I call them "repeating fields" by the way, as you can already have multiple (different) fields on a single page... but each with a single value. I see 2 major questions that need to be answered before I can implement this in Scribus Generator (which I would really like, by the way). Can you please tell me your view on these 2 elements?
Let's take a example of a catalog of products:

A single page in the generated document would gather products of the same family, say p1 = trees, p2 = flowers, p3 = garden furnitures.
On each page you'd use the following (non-repeating) variables: category-title, category-picture, and then
a table of the products of that family, and for each product you'd use in its table-row the following (repeating) variables: product-name, product-price

My two questions/problems are the following (the first is more problematic to me, so we need to solve it first ;) :

How to represent the repeating element (the table row, or the list item) in Scribus (GUI editor) in a user-friendly way, but in a way we can identify which element to repeat and how to repeat it (eg: should the line 2 go below, on the right, on the left, above, elsewhere?).  In short: how would you represent your list in the sla template that the generator would use?  (feel free to attach an sla example!). This questions has been touched upon (but not answered) in #11
What data format would you use instead of CSV? XML variants have been discussed in #19, but I'd like to keep on supporting something spreadsheet-like, as it makes the whole approach more accessible to less tech-savy users (hopefully). In short: how would you represent data for this catalog in excel/open-office ?

Have a nice day!
B.

Sorry to have messed it up.
Unfortunately, among the language barriers and my total ignorance, I'm afraid I can't be of any help here. My only experience was with commercial software (Indesign), a lot of trials and back in 2010.
Possibly, I could beta test some solutions, if there will be any and, even in that case, do net expect me to be too techie :-)
Keep up your good job and thank you very much,
Francesco

Ok Francesco. Thanks for the idea of copying the way indesign does it... at least it gives me a few suggestions. I'll get back in touch with you if this gets implemented.


fix(deploy): changed ordering of artisan commands so that storage is …

In local testing I found that the ordering of the artisan commands mattered.
I changed so that the local command which includes storage:link should be run first so that optimizations and caching calls all happen in the correct directory.
The revision is to call php artisan deploy:local before php artisan deploy:global.

There still appears to be a merge conflict.

@greatislander @jobara I missed the merge conflict. It's been resolved.


Variant consolidation for answer distribution

This exposes the answer distribution API's new consolidate parameter to the client.  A description of the parameter's functionality can be found in that PR here.  Feedback encouraged! @jbau @dcadams @sarina @clintonb

Thanks for the pull request, @dylanrhodes! I've created OSPR-343 to keep track of it in JIRA. JIRA is a place for product owners to prioritize feature reviews by the engineering development teams.
Feel free to add as much of the following information to the ticket:

supporting documentation
edx-code email threads
timeline information ('this must be merged by XX date', and why that is)
partner information ('this is a course on edx.org')
any other information that can help Product understand the context for the PR

All technical communication about the code itself will still be done via the Github pull request interface. As a reminder, our process documentation is here.

Coverage remained the same when pulling 26273c37e436cf709403975890cecd911b3b0b13 on dylanrhodes/variant-consolidation into b12ac07bf3b64b0904911bf7da81db6a48aea960 on master.

Hey @dylanrhodes - help me a bit here with context, since I'm unfamiliar with Analytics work. Is this a new feature? Have you talked with the edX product team, and if not, do they need to be involved?

Hey @sarina this PR is just to expose the new parameter from the PR open against the data API repository (linked in the top comment).  A good explanation and discussion of what that parameter does for the API is linked there.

Coverage remained the same when pulling f604f003326978277cf467ae4a7f69da166d48e1 on dylanrhodes/variant-consolidation into b12ac07bf3b64b0904911bf7da81db6a48aea960 on master.

I am going to close this pull request without merging, since @shnayder and @jbau have opted to not parameterize the consolidate logic and instead make it mandatory for all problem/answer distribution API calls.  For more information, see here.

@dylanrhodes cool, thanks for proactively closing. Please delete your branch, as well, if it is no longer needed.


Increate .travis.yml consistency between repos

aspnet/Universe#349
minimize dotnet setup time; no need for caching
build with --quiet

2fe8c27


I ran into this exact issue as well and found that it is only present with<EMAIL_ADDRESS>downgrading to<EMAIL_ADDRESS>resolved the issue without needing to mess with environment variables.

Thanks @tylerlaberge

What was the issue @aishdhuri ?
Actually, today I also updated the<EMAIL_ADDRESS>and after that start getting below errors in all the components
Line 1:19:  Relative imports from parent directories are not allowed. Please either pass what you're importing through at runtime (dependency injection), move xxx.component.tsx to same directory as react or consider making react a package                     import/no-relative-parent-imports

This seems to be related to #9195
@ramesh-joshi could you report your issue to another issue


feat(command): allow items to be dynamically selected

PR Checklist
Please check if your PR fulfills the following requirements:

[x] The commit message follows our
guidelines: https://github.com/goetzrobin/spartan/blob/main/CONTRIBUTING.md#-commit-message-guidelines
[ ] Tests for the changes have been added (for bug fixes / features)
[ ] Docs have been added / updated (for bug fixes / features)

PR Type
What kind of change does this PR introduce?

[ ] Bugfix
[x] Feature
[ ] Code style update (formatting, local variables)
[ ] Refactoring (no functional changes, no api changes)
[ ] Build related changes
[ ] CI related changes
[ ] Documentation content changes
[ ] Other... Please describe:

Which package are you modifying?

[ ] accordion
[ ] alert
[ ] alert-dialog
[ ] aspect-ratio
[ ] avatar
[ ] badge
[ ] button
[ ] calendar
[ ] card
[ ] checkbox
[ ] collapsible
[ ] combobox
[x] command
[ ] context-menu
[ ] data-table
[ ] date-picker
[ ] dialog
[ ] dropdown-menu
[ ] hover-card
[ ] icon
[ ] input
[ ] label
[ ] menubar
[ ] navigation-menu
[ ] pagination
[ ] popover
[ ] progress
[ ] radio-group
[ ] scroll-area
[ ] select
[ ] separator
[ ] sheet
[ ] skeleton
[ ] slider
[ ] sonner
[ ] spinner
[ ] switch
[ ] table
[ ] tabs
[ ] textarea
[ ] toast
[ ] toggle
[ ] tooltip
[ ] typography

What is the current behavior?
currently, there's no way to tell if a command item is aria-selected. so the problem is that the first item will always look like this:

after this PR it would look like this:

  <brn-cmd-list hlm>
    <brn-cmd-group hlm>
       @for (item of items(); track $index) {
         <button
              hlm
              brnCmdItem
              [selected]="currentItem() === item"
            >

Closes #
What is the new behavior?
Does this PR introduce a breaking change?

[ ] Yes
[x] No

Other information

is the ci/prettier something I can fix? cause locally ci.format-sort says there's no fix to apply.

also, my implementation is breaking the keyboard navigation 😅

I realized there must be a bug with the cmdk lib, theoretically to achieve what I want here a simple class cmdk-item-active should be enough but I have no idea why it doesn't work.

I ended up with a simpler solution which depends only on the aria-selected attribute since setting it on the host has no effect.
https://github.com/user-attachments/assets/6b84c07a-a737-474c-ab40-06f08bcb7455


heatmap_slicer should accept a cmap argument

Problem
you can't chose the cmap when using heatmap slicer unles you change it using rcparams. This is probably mostly fine, but it's also an arbitrary restriction that doesn't make anything else easier. So this is part enhancement part bug
Proposed Solution
heatmap_slicer should pass pcolormesh kwargs on to pcolormehs

this is very similar to https://github.com/ianhi/mpl-interactions/issues/61


Allow multiple json-ld objects

Fixes  https://github.com/laurengarcia/url-metadata/issues/83

I see, yes this is a breaking change we'll have to bump major version but you're right this is def a bug.
Been meaning to mock the test pages but too lazy :)

Merged, thanks!

New version 4.0.0 available: https://www.npmjs.com/package/url-metadata


Need for Speed: Carbon → everything is black

with d9vk:

System information

GPU: Nvidia GT 730M
Driver: 435.21
Wine version: Proton 4.11
DXVK version: #886

Apitrace file(s)
https://mega.nz/#!mqoFQCZJ!eH2IxGr0m__FRJawvfgh-uJbE-O2qiobKQIsrsy3uL4
Log files
nfs-carbon.log

I think it fixed with the latest job. Try it.

Trace plays fine for me.

Fixed.
Tested with #888


deepstream CLI can't be called from .bin directory

This is an issue if you install deepstream globally with npm.
If you installed it locally then you can just use the path to node_modules/deepstream/bin/deepstream

duplicate of #460


Add Popcorn-Time

https://github.com/caskroom/homebrew-cask/issues?utf8=✓&q=popcorn-time.

 Thanks for the link!


ArrayBuffer broken

If you attempt to create a arraybuffer the runtime will crash.
Ex:
'''var ab =new ArrayBuffer (10);'''
I'm pretty sure it was crashing at creation; but since I'm on my phone

I can't verify right this sec.   If that doesn't cause it to crash add
var ib = Int8Array(ab);
to the code and our will crash worth the error specifing an issue creating the arraybuffer.
The other direction also crashes the runtimes:
var ib = new Int8Array (10) ;
var ab = ib.buffer;

This is on v1.20 of the runtimes.


Menu component exception

Hi! I have a strange error during initialization of <m-menu> with more then one list item (with just one list item it works).
Here is my layout:
                <m-menu-anchor slot="actions">
                    <m-icon icon="more_vert" @click="menuOpen=true"></m-icon>
                    <m-menu v-model="menuOpen">
                        <m-list>
                            <m-list-item @click="Refresh">
                                <m-icon slot="graphic" icon="refresh"></m-icon>
                                Refresh
                            </m-list-item>
                            <m-list-divider></m-list-divider>
                            <m-list-item @click="Add">
                                <m-icon slot="graphic" icon="face"></m-icon>
                                Add User
                            </m-list-item>
                        </m-list>
                    </m-menu>
                </m-menu-anchor>

Here is an error:
jsdelivr-separator.js:1 TypeError: Cannot read property 'indexOf' of undefined
    at menu.min.js:66
    at Array.filter (<anonymous>)
    at o.updateSlot (menu.min.js:66)
    at o.mounted (menu.min.js:66)
    at _t (jsdelivr-separator.js:1)
    at Object.insert (jsdelivr-separator.js:1)
    at A (jsdelivr-separator.js:1)
    at hn.__patch__ (jsdelivr-separator.js:1)
    at hn._update (jsdelivr-separator.js:1)
    at hn.<anonymous> (jsdelivr-separator.js:1)
    at St.get (jsdelivr-separator.js:1)
    at new St (jsdelivr-separator.js:1)
    at hn.$mount (jsdelivr-separator.js:1)
    at hn.$mount (jsdelivr-separator.js:1)
    at hn._init (jsdelivr-separator.js:1)
    at new hn (jsdelivr-separator.js:1)
    ...

Sorry, I'm using minified version from CDN, but menu component folder contains only one indexOf occurrence, should be there: https://github.com/matsp/material-components-vue/blob/master/components/menu/Menu.vue#L78.

Thanks for filling the issue @nikolay-turpitko! Best time to fix and refactor that ugly piece of code :see_no_evil:

I can't reproduce that error. For further investigation I would need access to an environment where I can reproduce the error.
What version you are using?

Hmm...  I include components like below. I'm trying to avoid nodejs/npm/webpack/... in this case. To be honest, I'm trying to avoid javascript at all :-), I'm using Go-to-JS compiler (gopherjs), so things are a bit rough at my setup.
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/combine/npm/material-components-vue@0.23.0/dist/button/button.min.css,npm/material-components-vue@0.23.0/dist/checkbox/checkbox.min.css,npm/material-components-vue@0.23.0/dist/dialog/dialog.min.css,npm/material-components-vue@0.23.0/dist/drawer/drawer.min.css,npm/material-components-vue@0.23.0/dist/elevation/elevation.min.css,npm/material-components-vue@0.23.0/dist/fab/fab.min.css,npm/material-components-vue@0.23.0/dist/floating-label/floating-label.min.css,npm/material-components-vue@0.23.0/dist/list/list.min.css,npm/material-components-vue@0.23.0/dist/line-ripple/line-ripple.min.css,npm/material-components-vue@0.23.0/dist/layout-grid/layout-grid.min.css,npm/material-components-vue@0.23.0/dist/menu/menu.min.css,npm/material-components-vue@0.23.0/dist/textfield/textfield.min.css,npm/material-components-vue@0.23.0/dist/theme/theme.min.css,npm/material-components-vue@0.23.0/dist/top-app-bar/top-app-bar.min.css,npm/material-components-vue<EMAIL_ADDRESS>


Skills

Hello I would like to know if you can put the skills in French for Channel control
thank you in advance

translate.pdf
I need translation of all these elements and I can try to submit to Amazon for approval

IR Controller Smart Home Skill that allows registration of your TV / other infrared smart home controller devices with Alexa. Your http URLs are translated into natural language smart home operations.
Register your IR Controller smart devices at https://tehpsyc.pythonanywhere.com/
Skill is designed to work with the https://github.com/mdhiggins/ESP8266-HTTP-IR-Blaster schematic and software. It may be possible to use similar HTTP enabled devices as well. The IR Blaster can be easily assembled with parts under $10 and provides full home theater control.

For the part you can't fully read in the PDF

Hi,
is this issue still open ?
if yes, I can provide french translation. Let me know the best way to send it to you.
Al

Yes I still need help with the translation. You can see the PDF from earlier. I got the other languages approved but didn't have anyone to do a native French translation.

ok. I am on it.

Hi, I sent a while ago the translation to you by email. Just wondering if you could submit the FR langage skill to Amazon ?

thanks.


feeback improved and functional now

name: Pull_request_TEMPLATE.yml
about: use this template for creation of pull requests
title: '[FIX/Feat] '
labels: ''
assignees: ''

name: Pull Request Template
Description

feedback form made functional and improved

Fixes # (issue)

Screenshots (if applicable)

Type of Change

[x] Bug fix (non-breaking change which fixes an issue)
[x] New feature (non-breaking change which adds functionality)
[x] Breaking change (fix or feature that would cause existing functionality to not work as expected)
[ ] Documentation update

Checklist

[x] I have read the contributing document.
[x] I have performed a self-review of my own code.
[x] I have commented my code, particularly in hard-to-understand areas.
[x] I have added necessary tests to ensure my changes are effective.
[x] New and existing unit tests pass locally with my changes.
[x] Any dependent changes have been merged and published in downstream modules.

Additional Information

@mansiruhil13 please check my PR

@mansiruhil13 please check this PR!!!

@mansiruhil13 check this please

navbar has changed on all pages. can you make the similar one? please review your code again for that.

@mansiruhil13 yeah let me try

@mansiruhil13

Please check the PR now!

@mansiruhil13 check now

@mansiruhil13 check the PR please


Size doesn't update on resize

Hi,
I must certainly be doing something wrong, but can't make it work properly.
I'm using lazysizes with data-srcset and data-sizes="auto" but when I resize the window, it doesn't load bigger src.
Here's the markup after page load:
<img class="lazyautosizes lazyloaded" 	 src="img/200/img.jpg"  	 data-src="img/200/img.jpg"  	 srcset="200/img.jpg 200w, 			 320/img.jpg 320w, 			 420/img.jpg 420w, 			 490/img.jpg 490w, 			 560/img.jpg 560w, 			 620/img.jpg 620w, 			 680/img.jpg 680w, 			 740/img.jpg 740w, 			 780/img.jpg 780w, 			 840/img.jpg 940w, 			 980/img.jpg 980w, 			 1120/img.jpg 1120w"  	 data-srcset="200/img.jpg 200w, 			320/img.jpg 320w, 			420/img.jpg 420w, 			490/img.jpg 490w, 			560/img.jpg 560w, 			620/img.jpg 620w, 			680/img.jpg 680w, 			740/img.jpg 740w, 			780/img.jpg 780w, 			840/img.jpg 940w, 			980/img.jpg 980w, 			1120/img.jpg 1120w"  	data-sizes="auto"  	alt="alt text"  	sizes="198px">
"sizes" stays the same regardless of the window width when I resize.
I tried with respimg polyfill plugin without success.
Script included: lazysizes (the page also contains picturefill).
Thanks a lot.

Try:
img[data-sizes="auto"] { display: block; width: 100%; }

Perfect! Thanks you!

Sorry to reopen … but the solution above will only work for portrait-orientated images … and skew responsive images when you use percentage-based max-width/max-height

@raphaelokon
The full answer to this problem is documented in the readme:
https://github.com/aFarkas/lazysizes#specify-dimensions

Where am I doing wrong, only 'TransformerWidth290Height161' image is loading in all viewport