OLD | NEW |
1 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import common, datetime, fnmatch, logging, os, re, string, threading, time | 5 import common, datetime, fnmatch, logging, os, re, string, threading, time |
6 | 6 |
7 from autotest_lib.server import autotest, hosts, subcommand | 7 from autotest_lib.server import autotest, hosts, subcommand |
8 from autotest_lib.server import site_bsd_router | 8 from autotest_lib.server import site_bsd_router |
9 from autotest_lib.server import site_linux_router | 9 from autotest_lib.server import site_linux_router |
10 from autotest_lib.server import site_linux_server | 10 from autotest_lib.server import site_linux_server |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 self.server = hosts.create_host(server['addr']) | 136 self.server = hosts.create_host(server['addr']) |
137 self.server_at = autotest.Autotest(self.server) | 137 self.server_at = autotest.Autotest(self.server) |
138 # if not specified assume the same as the control address | 138 # if not specified assume the same as the control address |
139 self.server_wifi_ip = server.get('wifi_addr', self.server.ip) | 139 self.server_wifi_ip = server.get('wifi_addr', self.server.ip) |
140 self.__server_discover_commands(server) | 140 self.__server_discover_commands(server) |
141 else: | 141 else: |
142 self.server = None | 142 self.server = None |
143 # NB: wifi address must be set if not reachable from control | 143 # NB: wifi address must be set if not reachable from control |
144 self.server_wifi_ip = server['wifi_addr'] | 144 self.server_wifi_ip = server['wifi_addr'] |
145 | 145 |
146 # hosting_server is a machine which hosts network services, | 146 # The 'hosting_server' is a machine which hosts network |
147 # such as VPN. | 147 # services, such as OpenVPN or StrongSwan. |
148 self.hosting_server = site_linux_server.LinuxServer(self.server, server) | 148 self.hosting_server = site_linux_server.LinuxServer(self.server, server) |
149 | 149 |
150 # potential bg thread for ping untilstop | 150 # potential bg thread for ping untilstop |
151 self.ping_thread = None | 151 self.ping_thread = None |
152 | 152 |
153 # potential bg thread for client network monitoring | 153 # potential bg thread for client network monitoring |
154 self.client_netdump_thread = None | 154 self.client_netdump_thread = None |
155 self.__client_discover_commands(client) | 155 self.__client_discover_commands(client) |
156 self.profile_create({'name':'test'}) | 156 self.profile_create({'name':'test'}) |
157 self.profile_push({'name':'test'}) | 157 self.profile_push({'name':'test'}) |
(...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 'remote-cert-tls' : optional | 1233 'remote-cert-tls' : optional |
1234 If provided, this option can be 'server', 'client' or | 1234 If provided, this option can be 'server', 'client' or |
1235 'none'. | 1235 'none'. |
1236 If not specified, the default is 'none'. | 1236 If not specified, the default is 'none'. |
1237 The value provided is passed directly to 'connect-vpn'. | 1237 The value provided is passed directly to 'connect-vpn'. |
1238 """ | 1238 """ |
1239 self.vpn_client_kill({}) # Must be first. Relies on self.vpn_kind. | 1239 self.vpn_client_kill({}) # Must be first. Relies on self.vpn_kind. |
1240 self.vpn_kind = params.get('kind', None) | 1240 self.vpn_kind = params.get('kind', None) |
1241 vpn_host_ip = params.get('vpn-host-ip', self.server_wifi_ip) | 1241 vpn_host_ip = params.get('vpn-host-ip', self.server_wifi_ip) |
1242 | 1242 |
1243 # Must get 'ca_certificate', 'client-certificate' and 'client-key'. | |
1244 cert_pathnames = params.get('files', {}) | |
1245 | |
1246 # Starting up the VPN client may cause the DUT's routing table (esp. | 1243 # Starting up the VPN client may cause the DUT's routing table (esp. |
1247 # the default route) to change. Set up a host route backwards so | 1244 # the default route) to change. Set up a host route backwards so |
1248 # we don't lose our control connection in that event. | 1245 # we don't lose our control connection in that event. |
1249 __add_host_route(self.client) | 1246 self.__add_host_route(self.client) |
1250 | 1247 |
1251 if self.vpn_kind is None: | 1248 if self.vpn_kind is None: |
1252 raise error.TestFail('No VPN kind specified for this test.') | 1249 raise error.TestFail('No VPN kind specified for this test.') |
1253 elif self.vpn_kind == 'openvpn': | 1250 elif self.vpn_kind == 'openvpn': |
| 1251 # 'ca_certificate', 'client-certificate' and 'client-key'. |
| 1252 cert_pathnames = params.get('files', {}) |
1254 remote_cert_tls_option = "" | 1253 remote_cert_tls_option = "" |
1255 remote_cert_tls = params.get('remote-cert-tls', None) | 1254 remote_cert_tls = params.get('remote-cert-tls', None) |
1256 | 1255 |
1257 if remote_cert_tls is not None: | 1256 if remote_cert_tls is not None: |
1258 remote_cert_tls_option = "--remote-cert-tls " + remote_cert_tls | 1257 remote_cert_tls_option = "--remote-cert-tls " + remote_cert_tls |
1259 | 1258 |
1260 # connect-vpn openvpn [options] <name> <host-ip> <domain> \ | |
1261 # <cafile> <certfile> <key-file> | |
1262 result = self.client.run('%s/test/connect-vpn ' | 1259 result = self.client.run('%s/test/connect-vpn ' |
1263 '--verbose ' | 1260 '--verbose ' |
1264 '%s ' | 1261 '%s ' |
1265 'openvpn vpn-name %s vpn-domain ' | 1262 'openvpn vpn-name %s vpn-domain ' |
1266 '%s ' # ca certificate | 1263 '%s ' # ca certificate |
1267 '%s ' # client certificate | 1264 '%s ' # client certificate |
1268 '%s' % # client key | 1265 '%s' % # client key |
1269 (self.client_cmd_flimflam_lib, | 1266 (self.client_cmd_flimflam_lib, |
1270 remote_cert_tls_option, | 1267 remote_cert_tls_option, |
1271 vpn_host_ip, | 1268 vpn_host_ip, |
1272 cert_pathnames['ca-certificate'], | 1269 cert_pathnames['ca-certificate'], |
1273 cert_pathnames['client-certificate'], | 1270 cert_pathnames['client-certificate'], |
1274 cert_pathnames['client-key'])) | 1271 cert_pathnames['client-key'])) |
| 1272 elif self.vpn_kind == 'l2tpipsec-psk': # aka 'strongswan' |
| 1273 result = self.client.run('%s/test/connect-vpn ' |
| 1274 '--verbose ' |
| 1275 'l2tpipsec-psk vpn-name %s vpn-domain ' |
| 1276 'password chapuser chapsecret' % |
| 1277 (self.client_cmd_flimflam_lib, |
| 1278 vpn_host_ip)) |
| 1279 elif self.vpn_kind == 'l2tpipsec-cert': # aka 'strongswan' |
| 1280 # 'ca_certificate', 'client-certificate' and 'client-key'. |
| 1281 cert_pathnames = params.get('files', {}) |
| 1282 result = self.client.run('%s/test/connect-vpn ' |
| 1283 '--verbose ' |
| 1284 'l2tpipsec-cert vpn-name %s vpn-domain ' |
| 1285 '%s ' # ca certificate |
| 1286 '%s ' # client certificate |
| 1287 '%s' % # client key |
| 1288 (self.client_cmd_flimflam_lib, |
| 1289 vpn_host_ip, |
| 1290 cert_pathnames['ca-certificate'], |
| 1291 cert_pathnames['client-certificate'], |
| 1292 cert_pathnames['client-key'])) |
1275 else: | 1293 else: |
1276 raise error.TestFail('(internal error): No launch case ' | 1294 raise error.TestFail('(internal error): No launch case ' |
1277 'for VPN kind (%s)' % self.vpn_kind) | 1295 'for VPN kind (%s)' % self.vpn_kind) |
1278 | 1296 |
1279 def vpn_client_kill(self, params): | 1297 def vpn_client_kill(self, params): |
1280 """ Kill the VPN client if it's running. """ | 1298 """ Kill the VPN client if it's running. """ |
1281 if self.vpn_kind is not None: | 1299 if self.vpn_kind is not None: |
1282 if self.vpn_kind == 'openvpn': | 1300 if self.vpn_kind == 'openvpn': |
1283 self.client.run("pkill openvpn") | 1301 self.client.run("pkill openvpn") |
| 1302 elif (self.vpn_kind == 'l2tpipsec-psk' or # aka 'strongswan' |
| 1303 self.vpn_kind == 'l2tpipsec-cert'): |
| 1304 self.client.run("/usr/sbin/ipsec stop") |
1284 else: | 1305 else: |
1285 raise error.TestFail('(internal error): No kill case ' | 1306 raise error.TestFail('(internal error): No kill case ' |
1286 'for VPN kind (%s)' % self.vpn_kind) | 1307 'for VPN kind (%s)' % self.vpn_kind) |
1287 self.vpn_kind = None | 1308 self.vpn_kind = None |
1288 | 1309 |
1289 __del_host_route(self.client) | 1310 self.__del_host_route(self.client) |
1290 | 1311 |
1291 def __add_host_route(self, host): | 1312 def __add_host_route(self, host): |
1292 # What is the local address we use to get to the test host? | 1313 # What is the local address we use to get to the test host? |
1293 local_ip = site_host_route.LocalHostRoute(host.ip).route_info["src"] | 1314 local_ip = site_host_route.LocalHostRoute(host.ip).route_info["src"] |
1294 | 1315 |
1295 # How does the test host currently get to this local address? | 1316 # How does the test host currently get to this local address? |
1296 host_route = site_host_route.RemoteHostRoute(host, local_ip).route_info | 1317 host_route = site_host_route.RemoteHostRoute(host, local_ip).route_info |
1297 | 1318 |
1298 # Flatten the returned dict into a single string | 1319 # Flatten the returned dict into a single string |
1299 route_args = " ".join(" ".join(x) for x in host_route.iteritems()) | 1320 route_args = " ".join(" ".join(x) for x in host_route.iteritems()) |
1300 | 1321 |
1301 self.host_route_args[host.ip] = "%s %s" % (local_ip, route_args) | 1322 self.host_route_args[host.ip] = "%s %s" % (local_ip, route_args) |
1302 host.run("ip route add %s" % self.host_route_args[host.ip]) | 1323 host.run("ip route add %s" % self.host_route_args[host.ip]) |
1303 | 1324 |
1304 def __del_host_route(self, host): | 1325 def __del_host_route(self, host): |
1305 if host.ip not in self.host_route_args: | 1326 if host.ip in self.host_route_args: |
1306 return | 1327 host.run("ip route del %s" % self.host_route_args.pop(host.ip)) |
1307 | |
1308 host.run("ip route del %s" % self.host_route_args.pop(host.ip)) | |
1309 | 1328 |
1310 def host_route_cleanup(self, params): | 1329 def host_route_cleanup(self, params): |
1311 for host in (self.client, self.server, self.router): | 1330 for host in (self.client, self.server, self.router): |
1312 self.__del_host_route(host) | 1331 self.__del_host_route(host) |
1313 | 1332 |
1314 | 1333 |
1315 class HelperThread(threading.Thread): | 1334 class HelperThread(threading.Thread): |
1316 # Class that wraps a ping command in a thread so it can run in the bg. | 1335 # Class that wraps a ping command in a thread so it can run in the bg. |
1317 def __init__(self, client, cmd): | 1336 def __init__(self, client, cmd): |
1318 threading.Thread.__init__(self) | 1337 threading.Thread.__init__(self) |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1439 except error.TestFail: | 1458 except error.TestFail: |
1440 if 'expect_failure' in testcase: | 1459 if 'expect_failure' in testcase: |
1441 self.expect_failure(name, testcase['expect_failure']) | 1460 self.expect_failure(name, testcase['expect_failure']) |
1442 else: | 1461 else: |
1443 raise | 1462 raise |
1444 except Exception, e: | 1463 except Exception, e: |
1445 if 'expect_failure' in testcase: | 1464 if 'expect_failure' in testcase: |
1446 self.expect_failure(name, testcase['expect_failure']) | 1465 self.expect_failure(name, testcase['expect_failure']) |
1447 else: | 1466 else: |
1448 raise | 1467 raise |
OLD | NEW |