Reland "Update log when luci-auth is not logged-in"

This is a reland of commit 5e5802d7a244d01039076113b3d91b953105c58b

This was reverted as a temporary fix for servers running python 3.5. This reland removes `encoding` arg from `subprocess.run` temporarily until all servers are migrated to a supported python version.

Original change's description:
> Update log when luci-auth is not logged-in
>
> This change updates gsutil.py to capture when luci-auth is not logged in and prints useful log for signing in. This change couple enables luci-auth UI when luci-auth is enabled.
>
> Bug: 959170, 1359383
> Change-Id: Ic636bb362df388073e1fd11d736a47f35b749016
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/4154550
> Reviewed-by: Gavin Mak <gavinmak@google.com>
> Commit-Queue: Aravind Vasudevan <aravindvasudev@google.com>

Bug: 959170, 1359383
Change-Id: I409a49362f0c584bd39f1031671e9e089cf50f97
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/4165881
Commit-Queue: Josip Sokcevic <sokcevic@chromium.org>
Auto-Submit: Aravind Vasudevan <aravindvasudev@google.com>
Reviewed-by: Josip Sokcevic <sokcevic@chromium.org>
diff --git a/gsutil.py b/gsutil.py
index 3bff188..9363d64 100755
--- a/gsutil.py
+++ b/gsutil.py
@@ -169,32 +169,63 @@
 
 def luci_login():
   """Helper to run `luci-auth login`."""
-  _luci_auth_cmd('login')
+  # luci-auth requires interactive shell.
+  return _luci_auth_cmd('login', interactive=True)
 
 
-def _luci_auth_cmd(luci_cmd, wrapped_cmds=None):
+def _luci_auth_cmd(luci_cmd, wrapped_cmds=None, interactive=False):
   """Helper to call luci-auth command."""
-  print('WARNING: OOB authentication flow has been deprecated.')
-  print('Using luci-auth login instead.')
-  print('Override luci-auth by setting `BOTO_CONFIG` or '
-        '`AWS_CREDENTIAL_FILE` in your env.\n')
+  print('Using luci-auth login since OOB is deprecated.')
+  print('Override luci-auth by setting `BOTO_CONFIG` in your env.\n')
 
   cmd = ['luci-auth', luci_cmd, '-scopes', ' '.join(LUCI_AUTH_SCOPES)]
   if wrapped_cmds:
     cmd += ['--'] + wrapped_cmds
 
-  return _run_subprocess(cmd)
+  if interactive:
+    return _run_subprocess(cmd, interactive=True, env=_enable_luci_auth_ui())
+
+  p = _run_subprocess(cmd, env=_enable_luci_auth_ui())
+
+  # If luci-auth is not logged in.
+  if b'Not logged in.' in p.stderr:
+    print('Not logged in.\n')
+    print('Login by running:')
+    print('\t$ gsutil.py config')
+  else:
+    if p.stdout:
+      print(p.stdout.decode('utf-8'))
+
+    if p.stderr:
+      print(p.stderr.decode('utf-8'), file=sys.stderr)
+
+  return p
 
 
-def _run_subprocess(cmd):
+def _enable_luci_auth_ui():
+  """Returns environment variables to enable luci-auth"""
+  # TODO(aravindvasudev): clean up after luci-auth UI is released.
+  return {'LUCI_AUTH_LOGIN_SESSIONS_HOST': 'ci.chromium.org'}
+
+
+def _run_subprocess(cmd, interactive=False, env=None):
   """Wrapper to run the given command within a subprocess."""
-  return subprocess.call(cmd, shell=IS_WINDOWS)
+  kwargs = {'shell': IS_WINDOWS}
+
+  if env:
+    kwargs['env'] = dict(os.environ, **env)
+
+  if not interactive:
+    kwargs['stdout'] = subprocess.PIPE
+    kwargs['stderr'] = subprocess.PIPE
+
+  return subprocess.run(cmd, **kwargs)
 
 
 def run_gsutil(target, args, clean=False):
   # Redirect gsutil config calls to luci-auth.
   if os.getenv(GSUTIL_ENABLE_LUCI_AUTH) == '1' and 'config' in args:
-    return luci_login()
+    return luci_login().returncode
 
   gsutil_bin = ensure_gsutil(VERSION, target, clean)
   args_opt = ['-o', 'GSUtil:software_update_check_period=0']
@@ -229,9 +260,9 @@
   if (os.getenv(GSUTIL_ENABLE_LUCI_AUTH) != '1' or _is_luci_context()
       or os.getenv('SWARMING_HEADLESS') == '1' or os.getenv('BOTO_CONFIG')
       or os.getenv('AWS_CREDENTIAL_FILE')):
-    return _run_subprocess(cmd)
+    return _run_subprocess(cmd, interactive=True).returncode
 
-  return luci_context(cmd)
+  return luci_context(cmd).returncode
 
 
 def parse_args():