rpc rewrite: control RPCs using gRPC + separate RPC for data transfer
transport/ssh: update go-netssh to new version
=> supports CloseWrite and Deadlines
=> build: require Go 1.11 (netssh requires it)
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
# setup-specific
|
||||
inventory
|
||||
*.retry
|
||||
|
||||
# generated by gen_files.sh
|
||||
files/*ssh_client_identity
|
||||
files/*ssh_client_identity.pub
|
||||
files/*.tls.*.key
|
||||
files/*.tls.*.csr
|
||||
files/*.tls.*.crt
|
||||
files/wireevaluator
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
This directory contains very hacky test automation for wireevaluator based on nested Ansible playbooks.
|
||||
|
||||
* Copy `inventory.example` to `inventory`
|
||||
* Adjust `inventory` IP addresses as needed
|
||||
* Make sure there's an OpenSSH server running on the serve host
|
||||
* Make sure there's no firewalling whatsoever between the hosts
|
||||
* Run `GENKEYS=1 ./gen_files.sh` to re-generate self-signed TLS certs
|
||||
* Run the following command, adjusting the `wireevaluator_repeat` value to the number of times you want to repeat each test
|
||||
|
||||
```
|
||||
ansible-playbook -i inventory all.yml -e `wireevaluator_repeat=3`
|
||||
```
|
||||
|
||||
Generally, things are fine if the playbook doesn't show any panics from wireevaluator.
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
- hosts: connect,serve
|
||||
tasks:
|
||||
|
||||
- name: "run test"
|
||||
include: internal_prepare_and_run_repeated.yml
|
||||
wireevaluator_transport: "{{config.0}}"
|
||||
wireevaluator_case: "{{config.1}}"
|
||||
wireevaluator_repeat: "{{wireevaluator_repeat}}"
|
||||
with_cartesian:
|
||||
- [ tls, ssh, tcp ]
|
||||
-
|
||||
- closewrite_server
|
||||
- closewrite_client
|
||||
- readdeadline_server
|
||||
- readdeadline_client
|
||||
loop_control:
|
||||
loop_var: config
|
||||
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
cd "$( dirname "${BASH_SOURCE[0]}")"
|
||||
|
||||
FILESDIR="$(pwd)"/files
|
||||
|
||||
echo "[INFO] compile binary"
|
||||
pushd .. >/dev/null
|
||||
go build -o $FILESDIR/wireevaluator
|
||||
popd >/dev/null
|
||||
|
||||
if [ "$GENKEYS" == "" ]; then
|
||||
echo "[INFO] GENKEYS environment variable not set, assumed to be valid"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "[INFO] gen ssh key"
|
||||
ssh-keygen -f "$FILESDIR/wireevaluator.ssh_client_identity" -t ed25519
|
||||
|
||||
echo "[INFO] gen tls keys"
|
||||
|
||||
cakey="$FILESDIR/wireevaluator.tls.ca.key"
|
||||
cacrt="$FILESDIR/wireevaluator.tls.ca.crt"
|
||||
hostprefix="$FILESDIR/wireevaluator.tls"
|
||||
|
||||
openssl genrsa -out "$cakey" 4096
|
||||
openssl req -x509 -new -nodes -key "$cakey" -sha256 -days 1 -out "$cacrt"
|
||||
|
||||
declare -a HOSTS
|
||||
HOSTS+=("theserver")
|
||||
HOSTS+=("theclient")
|
||||
|
||||
for host in "${HOSTS[@]}"; do
|
||||
key="${hostprefix}.${host}.key"
|
||||
csr="${hostprefix}.${host}.csr"
|
||||
crt="${hostprefix}.${host}.crt"
|
||||
openssl genrsa -out "$key" 2048
|
||||
|
||||
(
|
||||
echo "."
|
||||
echo "."
|
||||
echo "."
|
||||
echo "."
|
||||
echo "."
|
||||
echo $host
|
||||
echo "."
|
||||
echo "."
|
||||
echo "."
|
||||
echo "."
|
||||
) | openssl req -new -key "$key" -out "$csr"
|
||||
|
||||
openssl x509 -req -in "$csr" -CA "$cacrt" -CAkey "$cakey" -CAcreateserial -out "$crt" -days 1 -sha256
|
||||
|
||||
done
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
---
|
||||
|
||||
- name: compile binary and any key files required
|
||||
local_action: command ./gen_files.sh
|
||||
|
||||
- name: Kill test binary
|
||||
shell: "killall -9 wireevaluator || true"
|
||||
- name: Deploy new binary
|
||||
copy:
|
||||
src: "files/wireevaluator"
|
||||
dest: "/opt/wireevaluator"
|
||||
mode: 0755
|
||||
|
||||
- set_fact:
|
||||
wireevaluator_connect_ip: "{{hostvars['connect'].ansible_host}}"
|
||||
wireevaluator_serve_ip: "{{hostvars['serve'].ansible_host}}"
|
||||
|
||||
- name: Deploy config
|
||||
template:
|
||||
src: "templates/{{wireevaluator_transport}}.yml.j2"
|
||||
dest: "/opt/wireevaluator.yml"
|
||||
|
||||
- name: Deploy client identity
|
||||
copy:
|
||||
src: "files/wireevaluator.{{item}}"
|
||||
dest: "/opt/wireevaluator.{{item}}"
|
||||
mode: 0400
|
||||
with_items:
|
||||
- ssh_client_identity
|
||||
- ssh_client_identity.pub
|
||||
- tls.ca.key
|
||||
- tls.ca.crt
|
||||
- tls.theserver.key
|
||||
- tls.theserver.crt
|
||||
- tls.theclient.key
|
||||
- tls.theclient.crt
|
||||
|
||||
- name: Setup server ssh client identity access
|
||||
when: inventory_hostname == "serve"
|
||||
block:
|
||||
- authorized_key:
|
||||
user: root
|
||||
state: present
|
||||
key: "{{ lookup('file', 'files/wireevaluator.ssh_client_identity.pub') }}"
|
||||
key_options: 'command="/opt/wireevaluator -mode stdinserver -config /opt/wireevaluator.yml client1"'
|
||||
- file:
|
||||
state: directory
|
||||
mode: 0700
|
||||
path: /tmp/wireevaluator_stdinserver
|
||||
|
||||
- name: repeated test
|
||||
include: internal_run_test_prepared_single.yml
|
||||
with_sequence: start=1 end={{wireevaluator_repeat}}
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
---
|
||||
|
||||
- debug:
|
||||
msg: "run test transport={{wireevaluator_transport}} case={{wireevaluator_case}} repeatedly"
|
||||
|
||||
- name: Run Server
|
||||
when: inventory_hostname == "serve"
|
||||
command: /opt/wireevaluator -config /opt/wireevaluator.yml -mode serve -testcase {{wireevaluator_case}}
|
||||
register: spawn_servers
|
||||
async: 60
|
||||
poll: 0
|
||||
|
||||
- name: Run Client
|
||||
when: inventory_hostname == "connect"
|
||||
command: /opt/wireevaluator -config /opt/wireevaluator.yml -mode connect -testcase {{wireevaluator_case}}
|
||||
register: spawn_clients
|
||||
async: 60
|
||||
poll: 0
|
||||
|
||||
- name: Wait for server shutdown
|
||||
when: inventory_hostname == "serve"
|
||||
async_status:
|
||||
jid: "{{ spawn_servers.ansible_job_id}}"
|
||||
delay: 0.5
|
||||
retries: 10
|
||||
|
||||
- name: Wait for client shutdown
|
||||
when: inventory_hostname == "connect"
|
||||
async_status:
|
||||
jid: "{{ spawn_clients.ansible_job_id}}"
|
||||
delay: 0.5
|
||||
retries: 10
|
||||
|
||||
- name: Wait for connections to die (TIME_WAIT conns)
|
||||
command: sleep 4
|
||||
changed_when: false
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
connect ansible_user=root ansible_host=192.168.122.128 wireevaluator_mode="connect"
|
||||
serve ansible_user=root ansible_host=192.168.122.129 wireevaluator_mode="serve"
|
||||
@@ -0,0 +1,13 @@
|
||||
connect:
|
||||
type: ssh+stdinserver
|
||||
host: {{wireevaluator_serve_ip}}
|
||||
user: root
|
||||
port: 22
|
||||
identity_file: /opt/wireevaluator.ssh_client_identity
|
||||
options: # optional, default [], `-o` arguments passed to ssh
|
||||
- "Compression=yes"
|
||||
serve:
|
||||
type: stdinserver
|
||||
client_identities:
|
||||
- "client1"
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
connect:
|
||||
type: tcp
|
||||
address: "{{wireevaluator_serve_ip}}:8888"
|
||||
serve:
|
||||
type: tcp
|
||||
listen: ":8888"
|
||||
clients: {
|
||||
"{{wireevaluator_connect_ip}}" : "client1"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
connect:
|
||||
type: tls
|
||||
address: "{{wireevaluator_serve_ip}}:8888"
|
||||
ca: "/opt/wireevaluator.tls.ca.crt"
|
||||
cert: "/opt/wireevaluator.tls.theclient.crt"
|
||||
key: "/opt/wireevaluator.tls.theclient.key"
|
||||
server_cn: "theserver"
|
||||
|
||||
serve:
|
||||
type: tls
|
||||
listen: ":8888"
|
||||
ca: "/opt/wireevaluator.tls.ca.crt"
|
||||
cert: "/opt/wireevaluator.tls.theserver.crt"
|
||||
key: "/opt/wireevaluator.tls.theserver.key"
|
||||
client_cns:
|
||||
- "theclient"
|
||||
Reference in New Issue
Block a user