vc4/ci: Replace expect script by python script

Replace the expect-based script to turn on/off the Raspberry Pi devices
using a python-based script.

v2:
 - Fix small nitpicks (Juan)
 - Limit line length (Andres)

v3:
 - Bump image tags (Eric, Andres)

v4:
 - Bump image tags (Eric)

Signed-off-by: Juan A. Suarez Romero <jasuarez@igalia.com>
Acked-by: Andres Gomez <agomez@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8362>
This commit is contained in:
Juan A. Suarez Romero 2021-01-07 10:33:03 +01:00 committed by Marge Bot
parent 64fd191d8a
commit 8588fb65d6
6 changed files with 134 additions and 48 deletions

View File

@ -391,7 +391,7 @@ arm_test-base:
- .fdo.container-build@debian
- .container
variables:
MESA_IMAGE_TAG: &arm_test-base "2020-12-03-expect"
MESA_IMAGE_TAG: &arm_test-base "2021-01-21-noexpect"
.use-arm_test-base:
extends:
@ -408,7 +408,7 @@ arm64_test:
extends:
- .use-arm_test-base
variables:
MESA_IMAGE_TAG: &arm64_test "2020-01-13-piglit"
MESA_IMAGE_TAG: &arm64_test "2021-01-21-noexpect"
.use-arm64_test:
variables:
@ -422,7 +422,7 @@ armhf_test:
extends:
- .use-arm_test-base
variables:
MESA_IMAGE_TAG: &armhf_test "2020-01-13-piglit"
MESA_IMAGE_TAG: &armhf_test "2021-01-21-noexpect"
.use-armhf_test:
variables:

View File

@ -5,4 +5,4 @@ if [ -z "$BM_POE_INTERFACE" ]; then
exit 1
fi
flock /var/run/poe.lock -c "$CI_PROJECT_DIR/install/bare-metal/poe-set $BM_POE_INTERFACE off"
$CI_PROJECT_DIR/install/bare-metal/poe-set.py $BM_POE_INTERFACE off

View File

@ -5,4 +5,4 @@ if [ -z "$BM_POE_INTERFACE" ]; then
exit 1
fi
flock /var/run/poe.lock -c "$CI_PROJECT_DIR/install/bare-metal/poe-set $BM_POE_INTERFACE reset"
$CI_PROJECT_DIR/install/bare-metal/poe-set.py $BM_POE_INTERFACE reset

View File

@ -1,42 +0,0 @@
#!/usr/bin/expect -f
set SWITCHSERVER $env(BM_POE_ADDRESS)
set USERNAME $env(BM_POE_USERNAME)
set PASSWORD $env(BM_POE_PASSWORD)
set PORTNUMBER [lindex $argv 0]
set POESTATUS [lindex $argv 1]
log_user 0
spawn telnet $SWITCHSERVER
expect "Login"
sleep 1
send "$USERNAME\t$PASSWORD\r"
expect "Menu"
send "\x01"
expect ">"
send "lcli\r"
expect "Name:"
send "$USERNAME\r"
expect "Password:"
send "$PASSWORD\r"
expect "#"
send "configure\r"
expect "(config)#"
send "interface GE $PORTNUMBER\r"
expect "(config-if)#"
if { "$POESTATUS" == "off" } {
send "power inline never\r"
} elseif { "$POESTATUS" == "on" } {
send "power inline auto\r"
} elseif { "$POESTATUS" == "reset" } {
send "power inline never\r"
send "power inline auto\r"
}
expect "(config-if)#"
send "exit\r"
expect "(config)#"
send "exit\r"
expect "$#"
send "exit\r"
expect eof

129
.gitlab-ci/bare-metal/poe-set.py Executable file
View File

@ -0,0 +1,129 @@
#!/usr/bin/env python3
# Copyright © 2021 Igalia, S.L.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
import argparse
import fcntl
import os
import telnetlib
import time
class Telnet:
def __init__(self, args):
self.retries = 3
self.lock_file = "/var/run/poe.lock"
self.debug = args.debug
self.lock = None
self.tn = None
try:
self.host = os.environ['BM_POE_ADDRESS']
self.username = os.environ['BM_POE_USERNAME'].encode('ascii')
self.password = os.environ['BM_POE_PASSWORD'].encode('ascii')
except KeyError as k:
raise OSError("envvar " + str(k) + " undefined")
def login(self):
# Sometimes login fails; retry 3 times before aborting
logged = False
for retry in range(self.retries):
self.lock = open(self.lock_file, 'w')
fcntl.flock(self.lock, fcntl.LOCK_EX)
self.tn = telnetlib.Telnet(self.host)
self.tn.set_debuglevel(1 if self.debug else 0)
self.tn.read_until(b'Password:')
self.tn.write(self.username + b'\t' + self.password + b'\r')
w = self.tn.read_until(b'Back', 3).decode('ascii')
if w.endswith("Back"):
logged = True
break
self.tn.close()
self.lock.close()
time.sleep(3)
if not logged:
raise OSError("Can not log in")
self.tn.write(b'\x01')
self.tn.read_until(b'>')
self.tn.write(b'lcli\r')
self.tn.read_until(b'User Name:')
self.tn.write(self.username + b'\r')
self.tn.read_until(b'Password:')
self.tn.write(self.password + b'\r')
self.tn.read_until(b'#')
def logout(self):
self.lock.close()
self.tn.close()
def select_port(self, port):
self.tn.write(b'configure\r')
self.tn.read_until(b'#')
self.tn.write(b'interface GE ' + str(port).encode('ascii') + b'\r')
self.tn.read_until(b'#')
def poe_on(self):
self.tn.write(b'power inline auto\r')
self.tn.read_until(b'#')
def poe_off(self):
self.tn.write(b'power inline never\r')
self.tn.read_until(b'#')
def poe_reset(self):
self.poe_off()
time.sleep(3)
self.poe_on()
def main():
parser = argparse.ArgumentParser(description='Powers on/off switch port')
parser.add_argument('-d', '--debug',
action='store_true',
help='Enable debug')
parser.add_argument('port',
type=int,
help='Port to turn on/off')
parser.add_argument('operation',
choices=['on', 'off', 'reset'],
help='Operation to perform')
args = parser.parse_args()
try:
telnet = Telnet(args)
telnet.login()
telnet.select_port(args.port)
if args.operation == "on":
telnet.poe_on()
elif args.operation == "off":
telnet.poe_off()
elif args.operation == "reset":
telnet.poe_reset()
telnet.logout()
except Exception as e:
print("Error! " + str(e))
if __name__ == '__main__':
main()

View File

@ -19,7 +19,6 @@ apt-get install -y --no-remove \
cmake \
cpio \
debootstrap \
expect \
fastboot \
flex \
g++ \