Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
device_cred_prov_test.py
1 #!/usr/bin/env python3
2 
3 import argparse
4 import os
5 import sys
6 import tempfile
7 
8 from pathlib import Path
9 
10 from prov_test_common import run_subprocess, verify_provisioned
11 
12 
13 def main():
14  parser = argparse.ArgumentParser(description='Run a local device credential provisioning test with aktualizr')
15  parser.add_argument('--build-dir', '-b', type=Path, default=Path('../build'), help='build directory')
16  parser.add_argument('--credentials', '-c', type=Path, default=Path('.'), help='path to credentials archive')
17  args = parser.parse_args()
18 
19  retval = 1
20  with tempfile.TemporaryDirectory() as tmp_dir:
21  retval = provision(Path(tmp_dir), args.build_dir, args.credentials)
22  return retval
23 
24 
25 CONFIG_TEMPLATE = '''
26 [pacman]
27 type = "none"
28 
29 [tls]
30 server_url_path = "{tmp_dir}/gateway.url"
31 
32 [storage]
33 path = "{tmp_dir}"
34 type = "sqlite"
35 
36 [import]
37 base_path = "{tmp_dir}/import"
38 tls_cacert_path = "root.crt"
39 tls_clientcert_path = "client.pem"
40 tls_pkey_path = "pkey.pem"
41 '''
42 
43 
44 def provision(tmp_dir, build_dir, creds):
45  conf_dir = tmp_dir / 'conf.d'
46  os.mkdir(str(conf_dir))
47  conf_prov = conf_dir / '20-device-cred-prov.toml'
48  with conf_prov.open('w') as f:
49  f.write(CONFIG_TEMPLATE.format(tmp_dir=tmp_dir))
50  akt = build_dir / 'src/aktualizr_primary/aktualizr'
51  akt_info = build_dir / 'src/aktualizr_info/aktualizr-info'
52  akt_cp = build_dir / 'src/cert_provider/aktualizr-cert-provider'
53 
54  akt_input = [str(akt), '--config', str(conf_dir), '--run-mode', 'once']
55  run_subprocess(akt_input)
56  # Verify that device has NOT yet provisioned.
57  stdout, stderr, retcode = run_subprocess([str(akt_info), '--config', str(conf_dir)])
58  if (b'Couldn\'t load device ID' not in stdout or
59  b'Couldn\'t load ECU serials' not in stdout or
60  b'Provisioned on server: no' not in stdout or
61  b'Fetched metadata: no' not in stdout):
62  print('Device already provisioned!? ' + stderr.decode() + stdout.decode())
63  return 1
64 
65  # Run aktualizr-cert-provider.
66  print('Device has not yet provisioned (as expected). Running aktualizr-cert-provider.')
67  stdout, stderr, retcode = run_subprocess([str(akt_cp),
68  '-c', str(creds), '-l', '/', '-s', '-u', '-r', '-g', str(conf_prov)])
69  if retcode > 0:
70  print('aktualizr-cert-provider failed (' + str(retcode) + '): ' +
71  stderr.decode() + stdout.decode())
72  return retcode
73 
74  run_subprocess(akt_input)
75  return verify_provisioned(akt_info, conf_dir)
76 
77 
78 if __name__ == '__main__':
79  sys.exit(main())