mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-11-04 00:02:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			583 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			583 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
"""builds the entire stack"""
 | 
						|
#For every matching build change here, that produces new installable
 | 
						|
#files, the cloud.spec file and the Debian control files must be
 | 
						|
#revised and tested.
 | 
						|
 | 
						|
import shutil,os
 | 
						|
import Utils,Node,Options,Logs,Scripting,Environment,Build,Configure
 | 
						|
from os import unlink as _unlink, makedirs as _makedirs, getcwd as _getcwd, chdir as _chdir
 | 
						|
from os.path import abspath as _abspath, basename as _basename, dirname as _dirname, exists as _exists, isdir as _isdir, split as _split, join as _join, sep, pathsep, pardir
 | 
						|
from glob import glob as _glob
 | 
						|
try: set([1,2,3])
 | 
						|
except Exception: from Sets import set
 | 
						|
import re
 | 
						|
import zipfile,tarfile
 | 
						|
try:
 | 
						|
  from os import chmod as _chmod,chown as _chown
 | 
						|
  import pwd,stat,grp
 | 
						|
except ImportError:
 | 
						|
  _chmod,_chown,pwd,stat,grp = (None,None,None,None,None)
 | 
						|
 | 
						|
required_env = [
 | 
						|
	"APISERVERLOG",
 | 
						|
	"MSLOG",
 | 
						|
	"PIDDIR",
 | 
						|
	"CPPATH",
 | 
						|
	"AGENTSIMULATORCLASSPATH",
 | 
						|
	"SYSTEMJAVADIR",
 | 
						|
	"USAGELOG",
 | 
						|
	"PLUGINJAVADIR",
 | 
						|
]
 | 
						|
for e in required_env:
 | 
						|
	if e not in bld.env: raise Utils.WafError("configure required: new variable %s added"%e)
 | 
						|
	
 | 
						|
sourcedir = bld.srcnode.abspath()
 | 
						|
builddir = bld.path.abspath(bld.env)
 | 
						|
buildpremium = _exists(_join(sourcedir,"cloudstack-proprietary"))
 | 
						|
filelist = bld.path.ant_glob
 | 
						|
 | 
						|
sccsinfo = _join(sourcedir,"sccs-info")
 | 
						|
if _exists(sccsinfo): bld.install_files("${DOCDIR}","sccs-info")
 | 
						|
 | 
						|
tgen = bld(features='subst', name='configure-info', source="configure-info.in", target="configure-info")
 | 
						|
def gen_configure_info():
 | 
						|
	lines = []
 | 
						|
	for key,val in sorted(bld.env.get_merged_dict().items()):
 | 
						|
		if "CLASSPATH" in key:
 | 
						|
			lines.append("  %s:"%key)
 | 
						|
			for v in val.split(pathsep):
 | 
						|
				lines.append("     %s"%v)
 | 
						|
			continue
 | 
						|
		lines.append("  %s:	%s"%(key,val))
 | 
						|
	return "\n".join(lines)
 | 
						|
tgen.dict = {"CONFIGUREVARS":gen_configure_info()}
 | 
						|
bld.install_files("${DOCDIR}","configure-info")
 | 
						|
 | 
						|
# ==================== Java compilation ===========================
 | 
						|
 | 
						|
sfl = lambda filespec: filelist(filespec,src=True,bld=False,dir=False,flat=True)
 | 
						|
 | 
						|
# discover ant targets and properties
 | 
						|
antxmlfiles = _glob(_join("build","*.xml")) + _glob(_join("build","*.properties"))
 | 
						|
if buildpremium: antxmlfiles += _glob(_join("build","premium","*.xml")) + _glob(_join("cloudstack-proprietary","build","*.xml"))
 | 
						|
targets,antprops = Utils.discover_ant_targets_and_properties(antxmlfiles)
 | 
						|
 | 
						|
javac_env = bld.env.copy()
 | 
						|
# FIXME trigger recompilation / cache avoidance when debuglevel changes.  ATM this does not happen.
 | 
						|
if antprops.get('debuglevel',None): javac_env.append_value("JAVACFLAGS",["-g:%s"%antprops['debuglevel']])
 | 
						|
Implementation_Version = bld.env.VERSION
 | 
						|
buildnumber = Utils.getbuildnumber()
 | 
						|
if buildnumber: Implementation_Version += "." + buildnumber
 | 
						|
 | 
						|
# compile .class files using waf
 | 
						|
classpathentries = [ _join(builddir,x[2]) for x in targets ]
 | 
						|
javawclasspath = pathsep.join( classpathentries + [ _abspath(x) for x in bld.env.CLASSPATH.split(pathsep) ] )
 | 
						|
javac_tgens = [
 | 
						|
		bld( features='javac', name=name, srcdir=srcdir, outdir=classdir,
 | 
						|
		after=" ".join(deps), classpath=javawclasspath, env=javac_env )
 | 
						|
	for name,srcdir,classdir,jarpath,deps in targets ]
 | 
						|
[ bld.process_after(tgen) for tgen in javac_tgens ]
 | 
						|
 | 
						|
# compile jar files using ant
 | 
						|
# ant only needs to be reinvoked if the version with build number changes
 | 
						|
# we here trim all the depended targets from the target list:
 | 
						|
build_targets = [ x[0] for x in targets ]
 | 
						|
nondep_build_targets = list ( set([ x[0] for x in targets ]) - set([ x for dependencies in [ y[4] for y in targets ] for x in dependencies ]) )
 | 
						|
ant_sources = " ".join(antxmlfiles + [ sfl(x[1] + "/**/*.java") for x in targets ])
 | 
						|
ant_jars = [ x[3] for x in targets ]
 | 
						|
 | 
						|
# because build-console-viewer does not use compile-java macro, we have to hardcode it here
 | 
						|
 | 
						|
ant_args = [
 | 
						|
	"-Dimpl.version=%s"%Implementation_Version,
 | 
						|
	"-Dtarget.dir=%s"%Utils.relpath(_join(builddir,"target")),
 | 
						|
	"-Ddist.dir=%s"%Utils.relpath(_join(builddir,"ant-dist")),
 | 
						|
]
 | 
						|
if not buildpremium: ant_args += ["-DOSS=true"]
 | 
						|
 | 
						|
# this is to trigger recompilation / cache avoidance if the relevant environment for ant changes
 | 
						|
tgen = bld(features='subst', name='version-info', source="version-info.in", target="version-info")
 | 
						|
tgen.dict = { "Implementation_Version":Implementation_Version,"JAVACFLAGS":javac_env.JAVACFLAGS,"ant_args":ant_args }
 | 
						|
bld.install_files("${DOCDIR}","version-info")
 | 
						|
 | 
						|
build_targets += ["version-info"]
 | 
						|
ant_sources += " version-info"
 | 
						|
 | 
						|
bld.path.ensure_dir_node_from_path("target/jar")
 | 
						|
tgen = bld(rule=Utils.runant, name='runant', source=ant_sources, target=ant_jars, anttgts = nondep_build_targets, antargs=ant_args, after=build_targets)
 | 
						|
bld.process_after(tgen)
 | 
						|
 | 
						|
# install jar files
 | 
						|
[ bld.install_files('${JAVADIR}',jar) for jar in ant_jars if _basename(jar).startswith("cloud-") ]
 | 
						|
 | 
						|
# ======================= End Java compilation ======================
 | 
						|
 | 
						|
 | 
						|
# =================== C / Python compilation =========================
 | 
						|
 | 
						|
if bld.env.DISTRO not in ['Windows','Mac']:
 | 
						|
	# build / install declarations of the daemonization utility - except for Windows
 | 
						|
	bld(
 | 
						|
		name='daemonize',
 | 
						|
		features='cc cprogram',
 | 
						|
		source='daemonize/daemonize.c',
 | 
						|
		target='daemonize/cloud-daemonize')
 | 
						|
 | 
						|
	# build / install declarations of vnet
 | 
						|
	files = """vnetd/connection.c vnetd/select.c vnetd/timer.c vnetd/spinlock.c vnetd/skbuff.c
 | 
						|
		vnetd/vnetd.c vnet-module/skb_util.c vnet-module/sxpr_util.c vnet-module/timer_util.c
 | 
						|
		vnet-module/etherip.c vnet-module/vnet.c vnet-module/vnet_eval.c vnet-module/vnet_forward.c
 | 
						|
		vnet-module/vif.c vnet-module/tunnel.c vnet-module/sa.c vnet-module/varp.c
 | 
						|
		libxutil/allocate.c libxutil/enum.c libxutil/file_stream.c libxutil/hash_table.c
 | 
						|
		libxutil/iostream.c libxutil/lexis.c libxutil/socket_stream.c libxutil/string_stream.c
 | 
						|
		libxutil/sxpr.c libxutil/sxpr_parser.c libxutil/sys_net.c libxutil/sys_string.c libxutil/util.c"""
 | 
						|
	files = [ "vnet/src/%s"%s for s in Utils.to_list(files) ]
 | 
						|
	bld(
 | 
						|
		name='vnetd',
 | 
						|
		features='cc cprogram',
 | 
						|
		source= files,
 | 
						|
		includes="vnet/src/libxutil vnet/src/vnet-module vnet/src/vnetd",
 | 
						|
		lib='dl pthread'.split(),
 | 
						|
		target='vnet/%s-vnetd'%bld.env.PACKAGE,
 | 
						|
		install_path="${SBINDIR}"
 | 
						|
		)
 | 
						|
	
 | 
						|
	obj = bld(features = 'py',name='pythonmodules')
 | 
						|
	obj.find_sources_in_dirs('python/lib', exts=['.py'])
 | 
						|
 | 
						|
# ===================== End C / Python compilation ==========================
 | 
						|
 | 
						|
 | 
						|
# ================ Third-party / dependency installation ===============
 | 
						|
 | 
						|
bld.install_files('${JAVADIR}','deps/*.jar')
 | 
						|
if buildpremium: bld.install_files('${PREMIUMJAVADIR}','cloudstack-proprietary/thirdparty/*.jar')
 | 
						|
 | 
						|
# =================== End 3rdparty/dep install ========================
 | 
						|
 | 
						|
 | 
						|
# =================== Build install declaratoin of console proxy project ========
 | 
						|
 | 
						|
# -> binary unsubstitutable files
 | 
						|
start_path = bld.path.find_dir("console-proxy")
 | 
						|
bld.install_files("${CPLIBDIR}",
 | 
						|
	start_path.ant_glob("images/**",src=True,bld=False,dir=False,flat=True),
 | 
						|
	cwd=start_path,relative_trick=True)
 | 
						|
 | 
						|
# -> source files with tokens
 | 
						|
patterns = 'console-proxy/css/** console-proxy/js/** console-proxy/ui/** console-proxy/scripts/**'
 | 
						|
src_files = Utils.to_list(filelist(patterns,flat=True))
 | 
						|
subst_files = [ x+".subst" for x in src_files ]
 | 
						|
inst_files = [ Utils.relpath(x,"console-proxy") for x in src_files ]
 | 
						|
for src,tgt,inst in zip(src_files,subst_files,inst_files):
 | 
						|
	tgen = bld(features='subst', source=src, target=tgt)
 | 
						|
	tgen.dict = bld.env.get_merged_dict()
 | 
						|
	bld.path.find_or_declare(tgt)
 | 
						|
	bld.install_as("${CPLIBDIR}/%s"%inst, tgt)
 | 
						|
 | 
						|
# -> configuration
 | 
						|
if not Options.options.PRESERVECONFIG:
 | 
						|
	bld.install_files_filtered("${CPSYSCONFDIR}",filelist("console-proxy/conf.dom0/*"))
 | 
						|
 | 
						|
# ================== End console proxy ===================
 | 
						|
 | 
						|
 | 
						|
# ================ Creation of patch.tgz's ============================
 | 
						|
 | 
						|
# done here because the patches require substituted files
 | 
						|
patterns = "patches/**"
 | 
						|
src_files = Utils.to_list(filelist(patterns,flat=True))
 | 
						|
subst_files = [ x+".subst" for x in src_files ]
 | 
						|
inst_files = src_files
 | 
						|
for src,tgt,inst in zip(src_files,subst_files,inst_files):
 | 
						|
	tgen = bld(features='subst', name='patchsubst', source=src, target=tgt)
 | 
						|
	tgen.dict = bld.env.get_merged_dict()
 | 
						|
	bld.path.find_or_declare(tgt)
 | 
						|
 | 
						|
# this is a clever little thing
 | 
						|
# given a list of nodes, build or source
 | 
						|
# construct a tar file containing them
 | 
						|
# rooted in the parameter root =, specified in the task generator
 | 
						|
# and renaming the names of the files according to a rename(x) function passed to the task generator as well
 | 
						|
# if a build node's result of rename() has the same name as a source node, the build node will take precedence
 | 
						|
# for as long as the build node appears later than the source node (this is an implementation detail of waf we are relying on)
 | 
						|
def tar_up(task):
 | 
						|
	tgt = task.outputs[0].bldpath(task.env)
 | 
						|
	if _exists(tgt): _unlink(tgt)
 | 
						|
	z = tarfile.open(tgt,"w:gz")
 | 
						|
	fileset = {}
 | 
						|
	for inp in task.inputs:
 | 
						|
		src = inp.srcpath(task.env)
 | 
						|
		if src.startswith(".."):
 | 
						|
			srcname = Utils.relpath(src,_join("..",".")) # file in source dir
 | 
						|
		else:
 | 
						|
			srcname = Utils.relpath(src,_join(task.env.variant(),".")) # file in artifacts dir
 | 
						|
		if task.generator.rename: srcname = task.generator.rename(srcname)
 | 
						|
		for dummy in task.generator.root.split("/"):
 | 
						|
			splittedname = srcname.split("/")
 | 
						|
			srcname = "/".join(splittedname[1:])
 | 
						|
		fileset[srcname] = src
 | 
						|
	for srcname,src in fileset.items():
 | 
						|
		ti = tarfile.TarInfo(srcname)
 | 
						|
		ti.mode = 0755
 | 
						|
		ti.size = os.path.getsize(src)
 | 
						|
		f = file(src)
 | 
						|
		z.addfile(ti,fileobj=f)
 | 
						|
		f.close()
 | 
						|
	z.close()
 | 
						|
	return 0
 | 
						|
 | 
						|
if bld.env.DISTRO != "Windows":
 | 
						|
	for virttech in [ _basename(x) for x in _glob(_join("patches","*")) ]:
 | 
						|
		if virttech == "shared":
 | 
						|
			continue
 | 
						|
		patchfiles = filelist('patches/%s/** patches/shared/**'%virttech,src=True,bld=True,dir=False,flat=True)
 | 
						|
		tgen = bld(
 | 
						|
			rule   = tar_up,
 | 
						|
			source = patchfiles,
 | 
						|
			target = '%s-patch.tgz'%virttech,
 | 
						|
			name   = '%s-patch_tgz'%virttech,
 | 
						|
			root = "patches/%s"%virttech,
 | 
						|
			rename = lambda x: re.sub(".subst$","",x),
 | 
						|
			after = 'patchsubst',
 | 
						|
		)
 | 
						|
		bld.process_after(tgen)
 | 
						|
		bld.install_as("${AGENTLIBDIR}/scripts/vm/hypervisor/%s/patch.tgz"%virttech, "%s-patch.tgz"%virttech)
 | 
						|
 | 
						|
# ================== End creation of patch.tgz's ====================
 | 
						|
 | 
						|
 | 
						|
# ================== systemvm patch creation ====================
 | 
						|
 | 
						|
deps = " ".join( Utils.to_list(
 | 
						|
	"""
 | 
						|
	deps/cloud-xmlrpc-client-3.1.3.jar
 | 
						|
	deps/cloud-xmlrpc-common-3.1.3.jar
 | 
						|
	deps/cloud-log4j.jar
 | 
						|
	deps/cloud-gson-1.3.jar
 | 
						|
	deps/cloud-apache-log4j-extras-1.0.jar
 | 
						|
	deps/cloud-libvirt-0.4.5.jar
 | 
						|
	deps/cloud-jna.jar
 | 
						|
	deps/cloud-cglib.jar
 | 
						|
	"""
 | 
						|
) )
 | 
						|
thirdparties = " ".join( Utils.to_list(
 | 
						|
	"""
 | 
						|
	cloudstack-proprietary/thirdparty/xmlrpc-client-3.1.3.jar
 | 
						|
	cloudstack-proprietary/thirdparty/xmlrpc-common-3.1.3.jar
 | 
						|
	cloudstack-proprietary/thirdparty/ws-commons-util-1.0.2.jar
 | 
						|
	cloudstack-proprietary/thirdparty/log4j-1.2.15.jar
 | 
						|
	cloudstack-proprietary/thirdparty/gson-1.3.jar
 | 
						|
	cloudstack-proprietary/thirdparty/apache-log4j-extras-1.0.jar
 | 
						|
	cloudstack-proprietary/thirdparty/commons-httpclient-3.1.jar
 | 
						|
	cloudstack-proprietary/thirdparty/commons-logging-1.1.1.jar
 | 
						|
	cloudstack-proprietary/thirdparty/commons-collections-3.2.1.jar
 | 
						|
	cloudstack-proprietary/thirdparty/commons-codec-1.4.jar
 | 
						|
	cloudstack-proprietary/thirdparty/commons-pool-1.4.jar
 | 
						|
	cloudstack-proprietary/thirdparty/libvirt-0.4.5.jar
 | 
						|
	cloudstack-proprietary/thirdparty/jna.jar
 | 
						|
	cloudstack-proprietary/thirdparty/cglib-nodep-2.2.jar
 | 
						|
	"""
 | 
						|
) )
 | 
						|
 | 
						|
patterns = Utils.to_list(
 | 
						|
	"""
 | 
						|
	console-proxy/css/**
 | 
						|
	console-proxy/images/**
 | 
						|
	console-proxy/js/**
 | 
						|
	console-proxy/ui/**
 | 
						|
	console-proxy/conf/**
 | 
						|
	console-proxy/scripts/*.sh
 | 
						|
	console-proxy/vm-script/*.sh
 | 
						|
	scripts/storage/secondary/*sh
 | 
						|
	"""
 | 
						|
)
 | 
						|
premiumpatterns = patterns + ["cloudstack-proprietary/console-proxy-premium/certs/**"]
 | 
						|
 | 
						|
artifacts = "target/jar/VMOpsConsoleApplet.jar " + " ".join( "target/jar/cloud-%s.jar"%j for j in "console-proxy console-common agent utils api core".split() )
 | 
						|
premiumartifacts = artifacts + " target/jar/cloud-console-proxy-premium.jar"
 | 
						|
 | 
						|
sources = " ".join( [ filelist(x,src=True,bld=False,dir=False,flat=True) for x in patterns ] )
 | 
						|
premiumsources = " ".join( [ filelist(x,src=True,bld=False,dir=False,flat=True) for x in premiumpatterns ] )
 | 
						|
 | 
						|
systemfiles = [ (f,_join(".",_basename(f))) for f in bld.env.SYSTEMCLASSPATH.split(pathsep) ]
 | 
						|
systems = " ".join( [ n[1] for n in systemfiles ] )
 | 
						|
systemtargetdir = _join(builddir,".")
 | 
						|
def copydeps(task):
 | 
						|
	Utils.check_dir(systemtargetdir)
 | 
						|
	for src,tgt in systemfiles: shutil.copy(src,systemtargetdir)
 | 
						|
	return 0
 | 
						|
def zip_up(task):
 | 
						|
	tgt = task.outputs[0].bldpath(task.env)
 | 
						|
	if _exists(tgt): _unlink(tgt)
 | 
						|
	z = zipfile.ZipFile(tgt,"w")
 | 
						|
	for inp in task.inputs:
 | 
						|
		if inp.id&3==Node.BUILD:
 | 
						|
			src = inp.bldpath(task.env)
 | 
						|
			srcname = src
 | 
						|
			srcname = "/".join(srcname.split("/")[1:]) # chop off default/
 | 
						|
			if srcname.startswith("target/jar"): srcname = "/".join(srcname.split("/")[2:]) # chop off target/jar
 | 
						|
		else:
 | 
						|
			src = inp.srcpath(task.env)
 | 
						|
			srcname = src
 | 
						|
			srcname = "/".join(srcname.split("/")[1:]) # chop off ../
 | 
						|
			if srcname.startswith("cloudstack-proprietary"): srcname = "/".join(srcname.split("/")[1:]) # chop off cloudstack proprietary
 | 
						|
			srcname = "/".join(srcname.split("/")[1:]) # chop off project name
 | 
						|
		# post-process the paths
 | 
						|
		if True in [ srcname.startswith(strt) for strt in [ 'scripts/run','scripts/config_ssl','scripts/config_auth','scripts/ssvm-check' ] ]:
 | 
						|
			srcname = "/".join(srcname.split("/")[1:])
 | 
						|
		elif srcname.startswith('storage'):
 | 
						|
			srcname = "scripts/" + srcname
 | 
						|
		elif srcname.startswith('VMOpsConsoleApplet'):
 | 
						|
			srcname = "applet/" + srcname
 | 
						|
		elif srcname.startswith('certs'):
 | 
						|
			srcname = srcname
 | 
						|
		z.write(src,srcname)
 | 
						|
	z.close()
 | 
						|
	return 0
 | 
						|
 | 
						|
if bld.env.DISTRO not in ["Windows","Mac"]:
 | 
						|
	tgen = bld(
 | 
						|
		rule   = copydeps,
 | 
						|
		source = 'wscript_configure',
 | 
						|
		target = systems,
 | 
						|
		name   = 'getsystemjars',
 | 
						|
	)
 | 
						|
	tgen = bld(
 | 
						|
		rule   = zip_up,
 | 
						|
		source = " ".join( [sources,artifacts,deps,systems] ),
 | 
						|
		target = 'systemvm.zip',
 | 
						|
		name   = 'systemvm_zip',
 | 
						|
		after  = 'copydeps getsystemjars runant',
 | 
						|
	)
 | 
						|
	bld.process_after(tgen)
 | 
						|
if buildpremium:
 | 
						|
	tgen = bld(
 | 
						|
		rule   = zip_up,
 | 
						|
		source = " ".join( [premiumsources,premiumartifacts,thirdparties] ),
 | 
						|
		target = 'systemvm-premium.zip',
 | 
						|
		name   = 'systemvm-premium_zip',
 | 
						|
		after  = 'runant',
 | 
						|
	)
 | 
						|
	bld.process_after(tgen)
 | 
						|
 | 
						|
if bld.env.DISTRO not in [ "Windows", "Mac"]:
 | 
						|
	bld.install_files("${AGENTLIBDIR}/vms", "systemvm.zip")
 | 
						|
 | 
						|
if buildpremium:
 | 
						|
	bld.install_files("${AGENTLIBDIR}/vms", "systemvm-premium.zip")
 | 
						|
 | 
						|
# ================== End systemvm patch creation ====================
 | 
						|
 | 
						|
 | 
						|
# =================== Empty directory / symlink creation on install target ====================
 | 
						|
 | 
						|
# 7. make log and cache dirs (this actually runs first)
 | 
						|
if bld.env.DISTRO in 'Windows Mac': pass
 | 
						|
else:
 | 
						|
	x = ("root",bld.env.MSUSER)
 | 
						|
	directories = [
 | 
						|
		("${MSLOGDIR}",0770,x),
 | 
						|
		("${AGENTLOGDIR}",0770,x),
 | 
						|
		("${USAGELOGDIR}",0770,x),
 | 
						|
		("${CPLOGDIR}",0770,x),
 | 
						|
		("${LOCALSTATEDIR}/cache/${MSPATH}",0770,x),
 | 
						|
		("${LOCALSTATEDIR}/cache/${MSPATH}/temp",0770,x),
 | 
						|
		("${LOCALSTATEDIR}/cache/${MSPATH}/work",0770,x),
 | 
						|
		("${SHAREDSTATEDIR}/${MSPATH}",0770,x),
 | 
						|
		("${MSMNTDIR}",0770,x),
 | 
						|
		("${MSCONF}/Catalina",0770,x),
 | 
						|
		("${MSCONF}/Catalina/localhost",0770,x),
 | 
						|
		("${MSCONF}/Catalina/localhost/client",0770,x),
 | 
						|
		("${PIDDIR}",0755,("root","root")),
 | 
						|
		("${LOCKDIR}",0755,("root","root")),
 | 
						|
	]
 | 
						|
	
 | 
						|
	for a,mode,owner in directories:
 | 
						|
		s = bld.subst_add_destdir(a,bld)
 | 
						|
		if Options.is_install:
 | 
						|
			bld.install_dir(a)
 | 
						|
			bld.setownership(a,owner[0],owner[1],mode)
 | 
						|
	
 | 
						|
	# 8. create environment symlinks
 | 
						|
	symlinks = [
 | 
						|
		('${MSENVIRON}/bin', '${TOMCATHOME}/bin'),
 | 
						|
		('${MSENVIRON}/lib',  '${TOMCATHOME}/lib'),
 | 
						|
		('${MSENVIRON}/logs', "${MSLOGDIR}"),
 | 
						|
		('${MSENVIRON}/temp', '${LOCALSTATEDIR}/cache/${MSPATH}/temp'),
 | 
						|
		('${MSENVIRON}/work','${LOCALSTATEDIR}/cache/${MSPATH}/work'),
 | 
						|
		('${MSENVIRON}/conf', '${SYSCONFDIR}/${MSPATH}'),
 | 
						|
		("${AGENTLIBDIR}/css", '${CPLIBDIR}/css'),
 | 
						|
		("${AGENTLIBDIR}/images", '${CPLIBDIR}/images'),
 | 
						|
		("${AGENTLIBDIR}/js", '${CPLIBDIR}/js'),
 | 
						|
		("${AGENTLIBDIR}/ui", '${CPLIBDIR}/ui'),
 | 
						|
	]
 | 
						|
	
 | 
						|
	for lnk,dst in symlinks: bld.symlink_as(lnk,Utils.subst_vars(dst,bld.env))
 | 
						|
 | 
						|
# ================== End empty directory / symlink creation on install target =====================
 | 
						|
 | 
						|
 | 
						|
# =================== Subst / installation of agent scripts project ========
 | 
						|
 | 
						|
src_files = Utils.to_list(filelist("scripts/**",flat=True))
 | 
						|
subst_files = [ x+".subst" for x in src_files ]
 | 
						|
inst_files = src_files
 | 
						|
for src,tgt,inst in zip(src_files,subst_files,inst_files):
 | 
						|
	tgen = bld(features='subst', name='scriptssubst', source=src, target=tgt)
 | 
						|
	tgen.dict = bld.env.get_merged_dict()
 | 
						|
	bld.path.find_or_declare(tgt)
 | 
						|
	bld.install_as("${AGENTLIBDIR}/%s"%inst, tgt, chmod=0755)
 | 
						|
 | 
						|
# ================== End agent scripts ===================
 | 
						|
 | 
						|
 | 
						|
# ================== Subst / installation of scripts in bin directories ========================
 | 
						|
 | 
						|
bld.install_files_filtered("${LIBEXECDIR}","*/libexec/* cloudstack-proprietary/*/libexec/*",chmod=0755)
 | 
						|
bld.install_files_filtered("${BINDIR}","*/bindir/* cloudstack-proprietary/*/bindir/*",chmod=0755)
 | 
						|
bld.install_files_filtered("${SBINDIR}","*/sbindir/* cloudstack-proprietary/*/sbindir/*",chmod=0755)
 | 
						|
 | 
						|
# ================== End subst / installation of scripts in bin directories ========================
 | 
						|
 | 
						|
 | 
						|
# ================== Installation of scripts / bindirs / configuration files ===========================
 | 
						|
 | 
						|
# build / install declarations of test project
 | 
						|
if buildpremium:
 | 
						|
	proj = 'test'
 | 
						|
	start_path = bld.path.find_dir("cloudstack-proprietary/test/scripts")
 | 
						|
	bld.install_files('${LIBDIR}/${PACKAGE}/test',
 | 
						|
		start_path.ant_glob("**",src=True,bld=False,dir=False,flat=True),
 | 
						|
		cwd=start_path,relative_trick=True)
 | 
						|
	start_path = bld.path.find_dir("cloudstack-proprietary/test/metadata")
 | 
						|
	bld.install_files('${SHAREDSTATEDIR}/${PACKAGE}/test',
 | 
						|
		start_path.ant_glob("**",src=True,bld=False,dir=False,flat=True),
 | 
						|
		cwd=start_path,relative_trick=True)
 | 
						|
	if not Options.options.PRESERVECONFIG:
 | 
						|
		bld.install_files('${SYSCONFDIR}/%s/%s'%(bld.env.PACKAGE,proj),'cloudstack-proprietary/test/conf/*')
 | 
						|
 | 
						|
# build / install declarations of server project <- this is actually now in client project
 | 
						|
bld.install_files("${MSENVIRON}/webapps/client/WEB-INF",'client/WEB-INF/web.xml') # install web.xml file
 | 
						|
if not Options.options.PRESERVECONFIG:
 | 
						|
	bld.install_files_filtered("${SERVERSYSCONFDIR}","server/conf/*")
 | 
						|
 | 
						|
# build / install declarations of agent project
 | 
						|
proj = 'agent'
 | 
						|
start_path = bld.path.find_dir(proj)
 | 
						|
bld.install_files("${AGENTLIBDIR}",
 | 
						|
	start_path.ant_glob("storagepatch/**",src=True,bld=False,dir=False,flat=True),
 | 
						|
	cwd=start_path,relative_trick=True)
 | 
						|
if not Options.options.PRESERVECONFIG:
 | 
						|
	bld.install_files_filtered("${AGENTSYSCONFDIR}","%s/conf/*"%proj)
 | 
						|
 | 
						|
# build / install declarations of client UI project
 | 
						|
 | 
						|
# -> binary unsubstitutable files
 | 
						|
start_path = bld.path.find_dir("ui")
 | 
						|
bld.install_files("${MSENVIRON}/webapps/client",
 | 
						|
	start_path.ant_glob("*.ico **/*png **/*jpg **/*gif",src=True,bld=False,dir=False,flat=True),
 | 
						|
	cwd=start_path,relative_trick=True)
 | 
						|
 | 
						|
# -> source files with tokens
 | 
						|
patterns = 'ui/*html ui/**/*html ui/**/*js ui/**/*css ui/**/*properties ui/**/*jsp'
 | 
						|
src_files = Utils.to_list(filelist(patterns,flat=True))
 | 
						|
subst_files = [ x+".subst" for x in src_files ]
 | 
						|
inst_files = [ Utils.relpath(x,"ui") for x in src_files ]
 | 
						|
for src,tgt,inst in zip(src_files,subst_files,inst_files):
 | 
						|
	tgen = bld(features='subst', source=src, target=tgt)
 | 
						|
	tgen.dict = bld.env.get_merged_dict()
 | 
						|
	bld.path.find_or_declare(tgt)
 | 
						|
	bld.install_as("${MSENVIRON}/webapps/client/%s"%inst, tgt)
 | 
						|
 | 
						|
# -> minification of UI files
 | 
						|
def minifyjs(task):
 | 
						|
	tgt = task.outputs[0].bldpath(task.env)
 | 
						|
	inputfiles = []
 | 
						|
	outputfile = ['--js_output_file',tgt]
 | 
						|
	for inp in task.inputs:
 | 
						|
		src = inp.srcpath(task.env)
 | 
						|
		inputfiles.append(src)
 | 
						|
	newinputfiles = []
 | 
						|
	for inputfile in inputfiles:
 | 
						|
		if inputfile not in newinputfiles:
 | 
						|
			newinputfiles.append('--js')
 | 
						|
			newinputfiles.append(inputfile)
 | 
						|
	compilerjar = _join(sourcedir,'tools','gcc','compiler.jar')
 | 
						|
	return Utils.exec_command(["java",'-jar',compilerjar] + newinputfiles + outputfile,log=True)
 | 
						|
 | 
						|
javascripts = [
 | 
						|
	['ui/scripts/jquery-1.4.2.min.js','ui/scripts/date.js'],
 | 
						|
	Utils.to_list(filelist('ui/scripts/jquery*js')),
 | 
						|
	['ui/scripts/cloud.core.js','ui/scripts/cloud.core.callbacks.js'],
 | 
						|
	Utils.to_list(filelist('ui/scripts/cloud*js')),
 | 
						|
]
 | 
						|
sourcefiles = []
 | 
						|
for lst in javascripts:
 | 
						|
	for x in lst:
 | 
						|
		if x not in sourcefiles: sourcefiles.append(x)
 | 
						|
tgen = bld(
 | 
						|
	rule   = minifyjs,
 | 
						|
	source = sourcefiles,
 | 
						|
	target = 'ui/scripts/cloud.min.js',
 | 
						|
	name   = 'minifyjs',
 | 
						|
)
 | 
						|
bld.install_files("${MSENVIRON}/webapps/client/scripts", "ui/scripts/cloud.min.js")
 | 
						|
 | 
						|
# substitute and install generic tomcat config
 | 
						|
if not Options.options.PRESERVECONFIG:
 | 
						|
	bld.install_files_filtered("${MSCONF}","*/tomcatconf/* cloudstack-proprietary/*/tomcatconf/*")
 | 
						|
	bld.install_files("${MSCONF}",'client/tomcatconf/db.properties',chmod=0640)
 | 
						|
	bld.setownership("${MSCONF}/db.properties","root",bld.env.MSUSER)
 | 
						|
 | 
						|
# apply distro-specific config on top of the 'all' generic cloud-management config
 | 
						|
globspec = _join("*","distro",bld.env.DISTRO.lower(),"*") # matches premium/distro/centos/SYSCONFDIR
 | 
						|
distrospecificdirs=_glob(globspec) + _glob(_join("cloudstack-proprietary",globspec))
 | 
						|
for dsdir in distrospecificdirs:
 | 
						|
	start_path = bld.srcnode.find_dir(dsdir)
 | 
						|
	subpath,varname = _split(dsdir)
 | 
						|
	dsdirwithvar = _join("${%s}"%varname)
 | 
						|
	files = filelist('%s/**'%dsdir,src=True,bld=False,dir=False,flat=True)
 | 
						|
	mode = 0644
 | 
						|
	if "SYSCONFDIR" in dsdir:
 | 
						|
		mode = 0755
 | 
						|
		if Options.options.PRESERVECONFIG: continue
 | 
						|
	bld.install_files_filtered(dsdirwithvar, files,  cwd=start_path, relative_trick=True,chmod=mode)
 | 
						|
 | 
						|
# build / install declarations of usage
 | 
						|
if buildpremium:
 | 
						|
	if not Options.options.PRESERVECONFIG:
 | 
						|
		#print filelist("usage/conf/* cloudstack-proprietary/usage/conf/*")
 | 
						|
		#assert False
 | 
						|
		bld.install_files_filtered("${USAGESYSCONFDIR}","usage/conf/* cloudstack-proprietary/usage/conf/*")
 | 
						|
		bld.symlink_as("${USAGESYSCONFDIR}/db.properties",Utils.subst_vars("${MSCONF}/db.properties",bld.env))
 | 
						|
 | 
						|
# install db data files
 | 
						|
bld.install_files_filtered("${SETUPDATADIR}",filelist("*/db/* cloudstack-proprietary/*/db/*",excl=Node.exclude_regs + "\ncloud-gate\ncloud-bridge"))
 | 
						|
 | 
						|
# ================== End installation of scripts / bindirs / configuration files ===========================
 | 
						|
 | 
						|
 | 
						|
# ====================== Feature-specific plugins ========================
 | 
						|
 | 
						|
for plugin in _glob(_join("plugins","*")) + _glob(_join("cloudstack-proprietary","plugins","*")):
 | 
						|
	if not _exists(_join(plugin,"build.xml")): continue
 | 
						|
	pluginname = _basename(plugin)
 | 
						|
	target = 'target/jar/cloud-%s.jar' % pluginname
 | 
						|
	sources = filelist( '%s/**/*.java' % plugin.replace(sep,"/") , src=True, bld=False, dir=False )
 | 
						|
	tgen = bld(rule=lambda x: runant("compile-%s"%pluginname), name='compile_%s'%pluginname, source=sources, target=target, after='runant')
 | 
						|
	bld.install_files('${PLUGINJAVADIR}',target)
 | 
						|
 | 
						|
# ====================== End feature-specific plugins ====================
 | 
						|
 | 
						|
 | 
						|
# ====================== Vendor-specific plugins ========================
 | 
						|
 | 
						|
for vendor in _glob(_join("vendor","*")) + _glob(_join("cloudstack-proprietary","vendor","*")):
 | 
						|
	if not Options.options.PRESERVECONFIG:
 | 
						|
		bld.install_files_filtered("${MSCONF}/%s"%vendor,filelist("%s/tomcatconf/*"%vendor))
 | 
						|
 | 
						|
# ====================== End vendor-specific plugins ====================
 |