| # Copyright 2021 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import contextlib |
| import json |
| import os |
| import socket |
| |
| # Use a unix abstract domain socket: |
| # https://man7.org/linux/man-pages/man7/unix.7.html#:~:text=abstract: |
| SOCKET_ADDRESS = '\0chromium_build_server_socket' |
| BUILD_SERVER_ENV_VARIABLE = 'INVOKED_BY_BUILD_SERVER' |
| |
| |
| def MaybeRunCommand(name, argv, stamp_file): |
| """Returns True if the command was successfully sent to the build server.""" |
| |
| # When the build server runs a command, it sets this environment variable. |
| # This prevents infinite recursion where the script sends a request to the |
| # build server, then the build server runs the script, and then the script |
| # sends another request to the build server. |
| if BUILD_SERVER_ENV_VARIABLE in os.environ: |
| return False |
| with contextlib.closing(socket.socket(socket.AF_UNIX)) as sock: |
| try: |
| sock.connect(SOCKET_ADDRESS) |
| sock.sendall( |
| json.dumps({ |
| 'name': name, |
| 'cmd': argv, |
| 'cwd': os.getcwd(), |
| 'stamp_file': stamp_file, |
| }).encode('utf8')) |
| except socket.error as e: |
| # [Errno 111] Connection refused. Either the server has not been started |
| # or the server is not currently accepting new connections. |
| if e.errno == 111: |
| return False |
| raise e |
| return True |