scan_suggest.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import json
  2. import logging
  3. import os
  4. from distutils.util import strtobool
  5. from docker.constants import IS_WINDOWS_PLATFORM
  6. from docker.utils.config import find_config_file
  7. SCAN_BINARY_NAME = "docker-scan" + (".exe" if IS_WINDOWS_PLATFORM else "")
  8. log = logging.getLogger(__name__)
  9. class ScanConfig:
  10. def __init__(self, d):
  11. self.optin = False
  12. vars(self).update(d)
  13. def display_scan_suggest_msg():
  14. if environment_scan_avoid_suggest() or \
  15. scan_available() is None or \
  16. scan_already_invoked():
  17. return
  18. log.info("Use 'docker scan' to run Snyk tests against images to find vulnerabilities "
  19. "and learn how to fix them")
  20. def environment_scan_avoid_suggest():
  21. return os.getenv('DOCKER_SCAN_SUGGEST', 'true').lower() == 'false'
  22. def scan_already_invoked():
  23. docker_folder = docker_config_folder()
  24. if docker_folder is None:
  25. return False
  26. scan_config_file = os.path.join(docker_folder, 'scan', "config.json")
  27. if not os.path.exists(scan_config_file):
  28. return False
  29. try:
  30. data = ''
  31. with open(scan_config_file) as f:
  32. data = f.read()
  33. scan_config = json.loads(data, object_hook=ScanConfig)
  34. return scan_config.optin if isinstance(scan_config.optin, bool) else strtobool(scan_config.optin)
  35. except Exception: # pylint:disable=broad-except
  36. return True
  37. def scan_available():
  38. docker_folder = docker_config_folder()
  39. if docker_folder:
  40. home_scan_bin = os.path.join(docker_folder, 'cli-plugins', SCAN_BINARY_NAME)
  41. if os.path.isfile(home_scan_bin) or os.path.islink(home_scan_bin):
  42. return home_scan_bin
  43. if IS_WINDOWS_PLATFORM:
  44. program_data_scan_bin = os.path.join('C:\\', 'ProgramData', 'Docker', 'cli-plugins',
  45. SCAN_BINARY_NAME)
  46. if os.path.isfile(program_data_scan_bin) or os.path.islink(program_data_scan_bin):
  47. return program_data_scan_bin
  48. else:
  49. lib_scan_bin = os.path.join('/usr', 'local', 'lib', 'docker', 'cli-plugins', SCAN_BINARY_NAME)
  50. if os.path.isfile(lib_scan_bin) or os.path.islink(lib_scan_bin):
  51. return lib_scan_bin
  52. lib_exec_scan_bin = os.path.join('/usr', 'local', 'libexec', 'docker', 'cli-plugins',
  53. SCAN_BINARY_NAME)
  54. if os.path.isfile(lib_exec_scan_bin) or os.path.islink(lib_exec_scan_bin):
  55. return lib_exec_scan_bin
  56. lib_scan_bin = os.path.join('/usr', 'lib', 'docker', 'cli-plugins', SCAN_BINARY_NAME)
  57. if os.path.isfile(lib_scan_bin) or os.path.islink(lib_scan_bin):
  58. return lib_scan_bin
  59. lib_exec_scan_bin = os.path.join('/usr', 'libexec', 'docker', 'cli-plugins', SCAN_BINARY_NAME)
  60. if os.path.isfile(lib_exec_scan_bin) or os.path.islink(lib_exec_scan_bin):
  61. return lib_exec_scan_bin
  62. return None
  63. def docker_config_folder():
  64. docker_config_file = find_config_file()
  65. return None if not docker_config_file \
  66. else os.path.dirname(os.path.abspath(docker_config_file))