Add "gooftool log_source_hashes" command.

BUG=chrome-os-partner:30847
TEST=Unit tests, `gooftool log_source_hashes`

Change-Id: I21c4ebb1ff44144cff1ddbf3fbcc0c4c7039d17d
Reviewed-on: https://chromium-review.googlesource.com/209870
Tested-by: Jon Salz <jsalz@chromium.org>
Reviewed-by: Bowgo Tsai <bowgotsai@chromium.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Commit-Queue: Jon Salz <jsalz@chromium.org>
diff --git a/py/gooftool/gooftool.py b/py/gooftool/gooftool.py
index 6c88e7c..4a784c1 100755
--- a/py/gooftool/gooftool.py
+++ b/py/gooftool/gooftool.py
@@ -13,6 +13,7 @@
 """
 
 import collections
+import hashlib
 import logging
 import os
 import pipes
@@ -42,7 +43,9 @@
 from cros.factory.hwdb import hwid_tool
 from cros.factory.hwid import common
 from cros.factory.hwid import hwid_utils
+from cros.factory.test import factory
 from cros.factory.test.factory import FACTORY_LOG_PATH, DEVICE_STATEFUL_PATH
+from cros.factory.utils import file_utils
 from cros.factory.utils.process_utils import Spawn
 from cros.factory.privacy import FilterDict
 
@@ -689,6 +692,21 @@
   else:
     logging.warning('No stateful files at %s', tar_file)
 
+
+@Command('log_source_hashes')
+def LogSourceHashes(options):  # pylint: disable=W0613
+  """Logs hashes of source files in the factory toolkit."""
+  event_log.Log(
+      'source_hashes',
+      # Log hash function used, just in case we ever want to change it
+      hash_function='sha1prefix',
+      hashes=file_utils.HashFiles(
+          os.path.join(factory.FACTORY_PATH, 'py'),
+          lambda path: path.endswith('.py'),
+          # Use first 4 bytes of SHA1
+          hash_function=lambda data: hashlib.sha1(data).hexdigest()[0:8]))
+
+
 @Command('log_system_details')
 def LogSystemDetails(options):  # pylint: disable=W0613
   """Write miscellaneous system details to the event log."""
@@ -823,6 +841,7 @@
     next boot.
   """
   Verify(options)
+  LogSourceHashes(options)
   UntarStatefulFiles(options)
   SetFirmwareBitmapLocale(options)
   ClearGBBFlags(options)