aboutgitcodelistschat:MatrixIRC
path: root/web/demo_connect.sh
blob: ee6ffb0c548cb4c847e1e850e949a8d9368edb0e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/bin/sh -ef
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
# web/demo_connect.sh: Prepare asciinema(1) demo for connect example
#
# Copyright (c) 2023 Red Hat GmbH
# Author: Stefano Brivio <sbrivio@redhat.com>
#         Alice Frosi <afrosi@redhat.com>

SEITAN_DIR=$(pwd)
SESSION=demo
VIDEO=seitan-connect
PSEITAN=1
PEATER=2
PSERVER=3

setup_common() {
	tmux new-session -d -s $SESSION
	tmux send-keys -t $SESSION 'PS1="$ "'
	tmux send-keys -t $SESSION C-m
	tmux send-keys -t $SESSION clear
	tmux send-keys -t $SESSION C-m

	tmux set -t $SESSION window-status-format '#W'
	tmux set -t $SESSION window-status-current-format '#W'
	tmux set -t $SESSION status-left ''
	tmux set -t $SESSION window-status-separator ''

	tmux set -t $SESSION window-status-style 'bg=colour1 fg=colour15 bold'
	tmux set -t $SESSION status-right ''
	tmux set -t $SESSION status-style 'bg=colour1 fg=colour15 bold'
	tmux set -t $SESSION status-right-style 'bg=colour1 fg=colour15 bold'
	tmux send-keys -t $SESSION "cd ${SEITAN_DIR}" ENTER
	sleep 1
}

split_panes() {
	tmux split-window -h
	tmux send-keys -t $SESSION 'PS1="$ " && clear' ENTER
	tmux split-window -v
	tmux send-keys -t $SESSION 'PS1="$ " && clear' ENTER
}

SCRIPT_cooker='
cat demo/connect.hjson
###
clear
./seitan-cooker demo/connect.hjson demo/connect.gluten demo/connect.bpf
###
clear
'

SCRIPT_socat='
#
socat UNIX-LISTEN:/tmp/demo.sock -
#
'

SCRIPT_eater_connect='
#
./seitan-eater -i demo/connect.bpf -- socat OPEN:abcd UNIX-CONNECT:/var/run/pr-helper.sock
#
'

SCRIPT_eater_connect_fake='
#
./seitan-eater -i demo/connect.bpf -- socat - UNIX-CONNECT:/fake.sock
#
'

SCRIPT_eater_connect_error='
#
./seitan-eater -i demo/connect.bpf -- socat OPEN:abcd UNIX-CONNECT:/error.sock
#
'

SCRIPT_seitan='
#
./seitan -p $(pgrep seitan-eater) -i demo/connect.gluten
'

cmd_write() {
	__str="${@}"
	while [ -n "${__str}" ]; do
		__rem="${__str#?}"
		__first="${__str%"$__rem"}"
		if [ "${__first}" = ";" ]; then
			tmux send-keys -t $SESSION -l '\;'
		else
			tmux send-keys -t $SESSION -l "${__first}"
		fi
		sleep 0.05 || :
		__str="${__rem}"
	done
	sleep 2
	tmux send-keys -t $SESSION "C-m"
}

script() {
	IFS='
'
	for line in $(eval printf '%s\\\n' \$SCRIPT_${1}); do
		unset IFS
		case ${line} in
		"@")	tmux send-keys -t $SESSION C-m	;;
		"#"*)	sleep ${#line}			;;
		*)	cmd_write "${line}"		;;
		esac
		IFS='
'
	done
	unset IFS
}

wait_seitan_exit() {
	while [ "$(pgrep seitan)" != "" ] ; do sleep 1; done
}

clear_panes() {
	wait_seitan_exit
	panes=$(tmux list-panes |awk '{ print $1 }' | sed 's/://')
	for p in $panes
	do
		tmux select-pane -t $p
	        tmux send-keys -t $SESSION clear
	        tmux send-keys -t $SESSION C-m
	done
	sleep 1
}

teardown_common() {
	sleep 5
	tmux kill-session -t $SESSION
	sleep 5
}

printf '\e[8;22;80t'

setup_common

tmux send-keys -t $SESSION -l 'reset'
tmux send-keys -t $SESSION C-m
tmux rename-window -t $SESSION 'Seitan demo: generate input files'

asciinema rec --overwrite ${VIDEO}.cast -c 'tmux attach -t $SESSION' &
sleep 1
tmux refresh-client

# Input generation
tmux select-pane -t $PSEITAN
script cooker

# First part
split_panes

tmux select-pane -t $PSERVER
tmux rename-window -t $SESSION 'Seitan demo: connect to another path'
script socat

tmux select-pane -t $PEATER
script eater_connect
tmux select-pane -t $PSEITAN
script seitan
sleep 4

# Use only 2 panes
clear_panes
tmux kill-pane -t $PSERVER

# Second part
tmux rename-window -t $SESSION 'Seitan demo: mock connect syscall'
tmux select-pane -t $PEATER
script eater_connect_fake
tmux select-pane -t $PSEITAN
script seitan

sleep 4
clear_panes

# Third part
tmux rename-window -t $SESSION 'Seitan demo: error injection (EPERM)'
tmux select-pane -t $PEATER
script eater_connect_error
tmux select-pane -t $PSEITAN
script seitan

teardown_common
gzip -fk9 ${VIDEO}.cast