If in buildbot mode, ensure we have required binaries.

Currently that's just pbzip2, but for generating sdk's, we need it.
For builder speed reasons, any cros_sdk rebuild/setup needs it too.

Allowing pbzip2 to be missing leads to weirdness like sdk's sometimes
being single-threaded in decompression, sometimes parallelized.

BUG=chromium-os:26014
TEST=cbuildbot --buildbot options w/, and w/out pbzip2 installed.

Change-Id: I77edc03716d355479a10cc4aa956e236d02922d4
Reviewed-on: https://gerrit.chromium.org/gerrit/17772
Tested-by: Brian Harring <ferringb@chromium.org>
Reviewed-by: Chris Sosa <sosa@chromium.org>
Reviewed-by: David James <davidjames@chromium.org>
Commit-Ready: Brian Harring <ferringb@chromium.org>
diff --git a/scripts/cbuildbot.py b/scripts/cbuildbot.py
index 66190aa..7136441 100644
--- a/scripts/cbuildbot.py
+++ b/scripts/cbuildbot.py
@@ -45,6 +45,7 @@
 _DISTRIBUTED_TYPES = [constants.COMMIT_QUEUE_TYPE, constants.PFQ_TYPE,
                       constants.CANARY_TYPE, constants.CHROME_PFQ_TYPE,
                       constants.PALADIN_TYPE]
+_BUILDBOT_REQUIRED_BINARIES = ('pbzip2',)
 
 
 def _PrintValidConfigs(trybot_only=True):
@@ -924,6 +925,21 @@
       parser.error('Option --buildbot was given, but this system does not '
                    'support cgroups.   Failing.')
 
+    missing = []
+    for program in _BUILDBOT_REQUIRED_BINARIES:
+      ret = cros_lib.RunCommand('which %s' % program, shell=True,
+                                redirect_stderr=True, redirect_stdout=True,
+                                error_code_ok=True, print_cmd=False)
+      if ret.returncode != 0:
+        missing.append(program)
+
+    if missing:
+      parser.error("Option --buildbot requires the following binaries which "
+                   "couldn't be found in $PATH: %s"
+                   % (', '.join(missing)))
+
+
+
   if options.reference_repo:
     options.reference_repo = os.path.abspath(options.reference_repo)