installer: add option to extract overlord from toolkit

Ad an option '--extract-overlord' to allow the extraction of overlord
server from factory toolkit.

BUG=chrome-os-partner:41215
TEST=`./install_factory_toolkit.run -- --extract-overlord` then run
     `./overlord/overlordd` to make sure it works.

Change-Id: Iadf0153a985a7fa4f876cec9f0ade1c7e9cb6e04
Reviewed-on: https://chromium-review.googlesource.com/276842
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Commit-Queue: Wei-Ning Huang <wnhuang@chromium.org>
Trybot-Ready: Wei-Ning Huang <wnhuang@chromium.org>
Tested-by: Wei-Ning Huang <wnhuang@chromium.org>
diff --git a/py/toolkit/installer.py b/py/toolkit/installer.py
index a371e7e..7ff36be 100755
--- a/py/toolkit/installer.py
+++ b/py/toolkit/installer.py
@@ -15,6 +15,7 @@
 import argparse
 from contextlib import contextmanager
 import os
+import shutil
 import sys
 import tempfile
 
@@ -332,6 +333,25 @@
            '\n' % {'board': target_board})
 
 
+def ExtractOverlord(src_root, output_dir):
+  output_dir = os.path.join(output_dir, 'overlord')
+  try:
+    os.makedirs(output_dir)
+  except OSError as e:
+    print str(e)
+    return
+
+  # Copy overlord binary and resource files
+  shutil.copyfile(os.path.join(src_root, 'usr/bin/overlordd'),
+                  os.path.join(output_dir, 'overlordd'))
+  shutil.copytree(os.path.join(src_root, 'usr/share/overlord/app'),
+                  os.path.join(output_dir, 'app'))
+
+  # Give overlordd execution permission
+  os.chmod(os.path.join(output_dir, 'overlordd'), 0755)
+  print "Extarcted overlord under '%s'" % output_dir
+
+
 def main():
   import logging
   logging.basicConfig(level=logging.INFO)
@@ -389,6 +409,9 @@
   parser.add_argument('--exe-path', dest='exe_path',
                       nargs='?', default=None,
                       help='Current self-extracting archive pathname')
+  parser.add_argument('--extract-overlord', dest='extract_overlord',
+                      metavar='OUTPUT_DIR', type=str, default=None,
+                      help='Extract overlord from the toolkit')
 
   args = parser.parse_args()
 
@@ -402,6 +425,10 @@
     InitUmpire(args.exe_path, src_root, args.umpire_board)
     return
 
+  if args.extract_overlord is not None:
+    ExtractOverlord(src_root, args.extract_overlord)
+    return
+
   # --pack-into may be called directly so this must be done before changing
   # working directory to OLDPWD.
   if args.pack_into and args.repack is None: