#!/usr/bin/env python # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id$ import os, re, signal, sys, commands, pwd from string import rstrip options=[ '--get-hosts', '--set-hosts', '--get-verbose', '--set-verbose', '--get-log', '--set-log', '--install', '--help', '--get-env', '--set-env' ] tmpcmdline=sys.argv[1:] cmdline=[] envfile = '/etc/env.d/02distcc' def exithandler(foo,bar): os.kill(0,signal.SIGKILL) sys.exit(1) signal.signal(signal.SIGINT,exithandler) def isroot(ret=0): if os.getuid() != 0: if ret == 0: print '!!!',sys.argv[:1][0],tmpcmdline[0],'must be run as root' sys.exit(1) else: retval = 0 else: retval = 1 return retval def writeenv(var,value): isroot() distcc_env = [] distcc_env = open(envfile, 'r').readlines() distcc_env_new = open(envfile, 'w') for i in range(len(distcc_env)): if re.compile(var+'="(.*)"').match(distcc_env[i]): distcc_env[i] = var+'="'+value+'"\n' distcc_env_new.write(distcc_env[i]) #print 'Set',var,'to:',value os.popen('/usr/sbin/env-update') print 'If you want to use these new settings in an existing shell,' print 'you need to "source /etc/profile" to get the changes.' def readenv(var): distcc_env = open(envfile, 'r').read() match = re.compile(var+'="(.*)"').search(distcc_env) if match: print var+'='+match.group(1) else: print var,'not set.' def permissions(path,user,group): for file in os.listdir(path): #print 'Configuring',path+file+'...' os.chown(path+file,user,group) def installlinks(chost=''): for file in ['gcc', 'cc', 'c++', 'g++']: path = '/usr/lib/distcc/bin/' if not chost == '': file = chost+'-'+file if os.path.exists('/usr/bin/'+file): #print 'Creating',path+file,'symlink...' if not os.path.exists(path+file): os.symlink('/usr/bin/distcc',path+file) #else: # print 'Already exists. Skipping...' def createdistccdir(dir): if not os.path.exists(dir): os.mkdir(dir) os.chmod(dir, 1777) for x in tmpcmdline: if not x: continue if x[0:2]=="--": if not x in options: print "!!! Error:",x,"is an invalid option." sys.exit(1) else: cmdline = x if '--get-hosts' in tmpcmdline: HOSTS_ENV = os.environ.get('DISTCC_HOSTS') HOSTS_HOME = os.environ.get('HOME')+'/hosts' if HOSTS_ENV: print HOSTS_ENV elif os.path.isfile(HOSTS_HOME) and os.path.getsize(HOSTS_HOME) != 0: print HOSTS_HOME elif os.path.exists('/etc/distcc/hosts'): print rstrip(open('/etc/distcc/hosts', 'r').read()) else: print 'No configuration file found. Setup your hosts with --set-hosts.' elif '--set-hosts' in tmpcmdline: if isroot(1): PATH = '/etc/distcc' else: PATH = os.environ.get('HOME') createdistccdir(PATH) open(PATH+'/hosts', 'w').write(cmdline + '\n') elif '--get-verbose' in tmpcmdline: readenv('DISTCC_VERBOSE') elif '--set-verbose' in tmpcmdline: writeenv('DISTCC_VERBOSE',tmpcmdline[1]) elif '--get-log' in tmpcmdline: readenv('DISTCC_LOG') elif '--set-log' in tmpcmdline: writeenv('DISTCC_LOG',tmpcmdline[1]) elif '--install' in tmpcmdline: isroot() print 'Creating',envfile+'...' distcc_env = open(envfile, 'w') distcc_env.write('# This file is managed by distcc-config; use it to change these settings.\n') distcc_env.write('DISTCC_LOG=""\n') distcc_env.write('DCCC_PATH="/usr/lib/distcc/bin"\n') distcc_env.write('DISTCC_VERBOSE="0"\n') if os.WEXITSTATUS(commands.getstatusoutput('/usr/sbin/useradd -u 240 -g daemon -s /bin/false -d /dev/null -c "distccd" distcc')[0]) == 9: os.WEXITSTATUS(commands.getstatusoutput('/usr/sbin/usermod -g daemon -s /bin/false -d /dev/null -c "distccd" distcc')[0]) foobar = pwd.getpwnam('distcc') user = foobar[2] group = foobar[3] makeconf = open('/etc/make.conf', 'r').read() chost = re.compile('CHOST="(.*)"').search(makeconf).group(1) print 'Creating symlinks...' installlinks() installlinks(chost) print 'Checking permissions...' permissions('/usr/lib/distcc/bin/',user,group) permissions('/var/run/distccd/',user,group) elif '--get-env' in tmpcmdline: if len(tmpcmdline) == 1: print rstrip(open(envfile, 'r').read()) elif len(tmpcmdline) == 2: readenv(tmpcmdline[1]) else: print '!!! Error: Specify only one variable.' elif '--set-env' in tmpcmdline: if len(tmpcmdline) > 2 and len(tmpcmdline) <= 3: isroot() writeenv(tmpcmdline[1],tmpcmdline[2]) else: print '!!! Error: Awaiting two parameters.' else: print 'Usage: /usr/bin/distcc-config --set-hosts DISTCC_HOSTS | --get-hosts' print ' /usr/bin/distcc-config --set-verbose { 0 | 1 } | --get-verbose' print ' /usr/bin/distcc-config --set-log FILE | --get-log' print ' /usr/bin/distcc-config --set-env VARIABLE VALUE | --get-env [VARIABLE]'