zuul/zuul/cmd/fingergw.py
James E. Blair 27f872fb56 Remove default user for fingergw
We're presuming, by default, that a user named "zuul" exists, which
is not the case in some environments.  Change the default to avoid
dropping privileges, and require that this be explicitly set in order
to do so.

Change-Id: Ia677d2615dd9292a809df4c8859a60b7f4df6243
2019-02-07 12:33:25 -08:00

110 lines
3.6 KiB
Python

#!/usr/bin/env python
# Copyright 2017 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
import signal
import sys
import zuul.cmd
import zuul.lib.fingergw
from zuul.lib.config import get_default
class FingerGatewayApp(zuul.cmd.ZuulDaemonApp):
'''
Class for the daemon that will distribute any finger requests to the
appropriate Zuul executor handling the specified build UUID.
'''
app_name = 'fingergw'
app_description = 'The Zuul finger gateway.'
def __init__(self):
super(FingerGatewayApp, self).__init__()
self.gateway = None
def createParser(self):
parser = super(FingerGatewayApp, self).createParser()
parser.add_argument('command',
choices=zuul.lib.fingergw.COMMANDS,
nargs='?')
return parser
def parseArguments(self, args=None):
super(FingerGatewayApp, self).parseArguments()
if self.args.command:
self.args.nodaemon = True
def run(self):
'''
Main entry point for the FingerGatewayApp.
Called by the main() method of the parent class.
'''
if self.args.command in zuul.lib.fingergw.COMMANDS:
self.send_command(self.args.command)
sys.exit(0)
self.setup_logging('fingergw', 'log_config')
self.log = logging.getLogger('zuul.fingergw')
# Get values from configuration file
host = get_default(self.config, 'fingergw', 'listen_address', '::')
port = int(get_default(self.config, 'fingergw', 'port', 79))
user = get_default(self.config, 'fingergw', 'user', None)
cmdsock = get_default(
self.config, 'fingergw', 'command_socket',
'/var/lib/zuul/%s.socket' % self.app_name)
gear_server = get_default(self.config, 'gearman', 'server')
gear_port = get_default(self.config, 'gearman', 'port', 4730)
ssl_key = get_default(self.config, 'gearman', 'ssl_key')
ssl_cert = get_default(self.config, 'gearman', 'ssl_cert')
ssl_ca = get_default(self.config, 'gearman', 'ssl_ca')
self.gateway = zuul.lib.fingergw.FingerGateway(
(gear_server, gear_port, ssl_key, ssl_cert, ssl_ca),
(host, port),
user,
cmdsock,
self.getPidFile(),
)
self.log.info('Starting Zuul finger gateway app')
self.gateway.start()
if self.args.nodaemon:
# NOTE(Shrews): When running in non-daemon mode, although sending
# the 'stop' command via the command socket will shutdown the
# gateway, it's still necessary to Ctrl+C to stop the app.
while True:
try:
signal.pause()
except KeyboardInterrupt:
print("Ctrl + C: asking gateway to exit nicely...\n")
self.stop()
break
else:
self.gateway.wait()
self.log.info('Stopped Zuul finger gateway app')
def stop(self):
if self.gateway:
self.gateway.stop()
def main():
FingerGatewayApp().main()