Produced by Araxis Merge on 5/14/2018 1:18:45 PM Eastern Daylight Time. See www.araxis.com for information about Merge. This report uses XHTML and CSS2, and is best viewed with a modern standards-compliant browser. For optimum results when printing this report, use landscape orientation and enable printing of background images and colours in your browser.
| # | Location | File | Last Modified |
|---|---|---|---|
| 1 | MCCF_EDI_TAS_Infrastructure.zip\MCCF_EDI_TAS_Infrastructure\mccf_devops\scripts\shell | tas-init.sh | Tue Mar 27 23:55:42 2018 UTC |
| 2 | MCCF_EDI_TAS_Infrastructure.zip\MCCF_EDI_TAS_Infrastructure\mccf_devops\scripts\shell | tas-init.sh | Fri May 11 16:39:50 2018 UTC |
| Description | Between Files 1 and 2 |
|
|---|---|---|
| Text Blocks | Lines | |
| Unchanged | 13 | 1448 |
| Changed | 12 | 32 |
| Inserted | 0 | 0 |
| Removed | 0 | 0 |
| Whitespace | |
|---|---|
| Character case | Differences in character case are significant |
| Line endings | Differences in line endings (CR and LF characters) are ignored |
| CR/LF characters | Not shown in the comparison detail |
No regular expressions were active.
| 1 | #! /bin/ba sh | |
| 2 | # ==== Beg in Header ==== | |
| 3 | # tas-init .sh v2.1 2 017-Dec-27 PII ) | |
| 4 | # Add dos 2unix, wge t, yum-uti ls to stan dard build s | |
| 5 | # Remove password r equirement for non-N FS/FPC bui lds | |
| 6 | # tas-init .sh v2.0 2 017-Dec-11 PII ) | |
| 7 | # Remove Security s ettings an d other pa rts that a re now pro vided in | |
| 8 | # VA "Gol d Image" ( or self-cr eated with SysAdmin mag-init.s h) | |
| 9 | # tas-init .sh v1.0 2 017-Dec-08 PII ) | |
| 10 | # First r eal releas e | |
| 11 | # | |
| 12 | # These ar e the avai lable comm and-line o ptions: | |
| 13 | # -c or - -nocolor : Turn Off Color Debu g output | |
| 14 | # -l or - -logfile : Change lo gfile (mus t come nex t) | |
| 15 | # -f or - -fqdn : Use FQDN instead of detecting it (must come next) | |
| 16 | # -u or - -user : Username to use to access Bit Bucket (mc cf_devops) | |
| 17 | # -p or - -pass : Password to go with username above | |
| 18 | # -v or - -vpass : Vault Pas sword for Jenkins pa sswords & Private SS L Key | |
| 19 | # | |
| 20 | # This scr ipt assume s a system in one of the TAS e nvironment s | |
| 21 | # - VA AIT C (aka EDE ) is the A ustin IT C enter (VA Private Cl oud) | |
| 22 | # - VA Azu re (aka MA G) is the Microsoft Azure Gov Cloud | |
| 23 | # - Halfak er AWS (ak a AWS) is the Halfak er AWS Clo ud (tempor ary) | |
| 24 | # - Halfak er Azure ( aka HAC) i s the Half aker Azure Cloud (un defined) | |
| 25 | # - Indivi dual dev s ystems are NOT suppo rted and w ill likely be detect ed as AWS | |
| 26 | # | |
| 27 | # The task s this scr ipt perfor ms are ess entially t o create a system-st art-point | |
| 28 | # from whi ch the TAS Jenkins S erver can access the system an d configur e it | |
| 29 | # based on the requi rements ne eded by th e TAS Conf iguration Management Team | |
| 30 | # | |
| 31 | # A log of the progr ess and re sults of t his script is locate d at $LOGT XT | |
| 32 | # If run i nteractive ly, the pr ogress & r esults (di fferent fr om the log file) | |
| 33 | # are shown on the screen . If the c olorized o utput of t he interac tive | |
| 34 | # scr een are no t working, you can t urn off th e color wi th a -c op tion | |
| 35 | # | |
| 36 | # ==== End Header == == | |
| 37 | # Don't wa ste any ti me -- if y ou're not root, exit now | |
| 38 | if [ "${UI D}" != "0" ]; then | |
| 39 | echo " $0 Error: You must r un this sc ript as ro ot" >&2 | |
| 40 | exit 1 | |
| 41 | fi | |
| 42 | ||
| 43 | LOGFILE=/v ar/log/$0. log ; cp / dev/null $ {LOGFILE} # create & blank the log file | |
| 44 | DeployEnv= | |
| 45 | MyIP= | |
| 46 | MyHostname = | |
| 47 | MyDomain= | |
| 48 | MyFQDN= | |
| 49 | MyDNS1= | |
| 50 | MyDNS2= | |
| 51 | MyCIServer =localhost | |
| 52 | IsCIServer = | |
| 53 | IsVA=No | |
| 54 | VARH7BSTRA P="http:// DNS . URL /pub/boots trap/rhel7 .sh" | |
| 55 | VARH7LIC= | |
| 56 | PreInstall edPkgs="gi t ansible dos2unix w get yum-ut ils" | |
| 57 | # | |
| 58 | # VA DNS S ervers & T AS CI serv ers for ED E Environm ent | |
| 59 | VAEDEDNS1= IP | |
| 60 | VAEDEDNS2= IP | |
| 61 | VAEDECI=DN S.URL | |
| 62 | # | |
| 63 | # VA DNS S ervers & T AS CI serv ers for MA G Environm ent | |
| 64 | # NOTE: Fo r now, the DNS serve rs are ide ntical to EDE DNS se rvers | |
| 65 | # That i s expected to change at some t ime in the future | |
| 66 | VAMAGDNS1= IP | |
| 67 | VAMAGDNS2= IP | |
| 68 | VAMAGCI=DN S.URL | |
| 69 | # | |
| 70 | # Someday we will ha ve a HAC e nvironment -- until then, trea t as AWS | |
| 71 | HACDNS1=8. 8.4.4 | |
| 72 | HACDNS2=4. 2.2.3 | |
| 73 | HACCI=aws- master.tas .local. | |
| 74 | HACCIIP= IP | |
| 75 | # | |
| 76 | # If we're not in th e EDE or M AG, we ass ume AWS | |
| 77 | AWSDNS1=8. 8.4.4 | |
| 78 | AWSDNS2=4. 2.2.3 | |
| 79 | AWSCI=aws- master.mcc f.halfaker labs.com | |
| 80 | AWSCIIP= IP | |
| 81 | # | |
| 82 | # Jenkins Public Key | |
| 83 | JENKINSUSE R=jenkins | |
| 84 | JENKINSUID =410 | |
| 85 | JENKINSHOM E=/home/je nkins | |
| 86 | JENKINSSHE LL=/bin/ba sh | |
| 87 | JENKINSPUB ="ssh-rsa AAAAB3NzaC 1yc2EAAAAD AQABAAABAQ C2x99wM+da DVDMtJoKKc +gUDq+Nphi AzM/D25IQS pIXsHk/9rO 3wqXwCYvU7 6cOQ06hWbK nyaWrQN69P HfgIZzDLa9 hc8vBFkF+N wZc97PP32T eUbfTXf08t hJBZj/osD/ d1meeTQs4A 0oThZGZEpF g/P59MQnTl g0MXpIJzyS eWBAEapVq7 c2IjSJ+m3t GXi4S6E4c7 B7ompz3jO4 JTmbMrk6b3 lnCvJxvKic JB+8lfegX0 pDjNWdZ0PN uN1Hac2wpv dUIE5Bbunw 2nakArSvzM QlOkDFCWtU rgPqjpmbIv HtHmXVs5Ks etSHocFDXO 0gItvgEYGe r7hCYSTsSa mZ jenkins " | |
| 88 | # | |
| 89 | YUMSRC=bit bucket.org /halfaker/ mccf_yum | |
| 90 | YUMDIR=mcc f_yum | |
| 91 | YUMSH=./mv repo.sh | |
| 92 | MISCSRC=bi tbucket.or g/halfaker /mccf_misc _repo | |
| 93 | MISCDIR=mc cf_misc_re po | |
| 94 | MISCSH=./m vrepo.sh | |
| 95 | JENKINSSRC =bitbucket .org/halfa ker/mccf_j enkins | |
| 96 | JENKINSDIR =mccf_jenk ins | |
| 97 | JENKINSSH= ./mvrepo.s h | |
| 98 | DEVOPSSRC= bitbucket. org/halfak er/mccf_de vops | |
| 99 | DEVOPSDIR= mccf_devop s | |
| 100 | DEVOPSDIR2 =playbooks | |
| 101 | DEVOPSSH=. /installJe nkins.sh | |
| 102 | # | |
| 103 | # Define c olors and terminal e scape sequ ences for intereacti ve use | |
| 104 | UseColor=Y es | |
| 105 | CLEAR="\\0 33c" | |
| 106 | COL60="\\0 33[60G" | |
| 107 | NORMAL="\\ 033[0;39m" | |
| 108 | WHITE="\\0 33[1;39m" | |
| 109 | GREEN="\\0 33[1;32m" | |
| 110 | RED="\\033 [1;31m" | |
| 111 | YELLOW="\\ 033[1;33m" | |
| 112 | BLUE="\\03 3[1;34m" | |
| 113 | ||
| 114 | SHOWPROCES S="${COL60 }${BLUE}Pr ocessing${ NORMAL}" | |
| 115 | SHOWBUILD= "${COL60}$ {BLUE}Buil ding..${NO RMAL}" | |
| 116 | SHOWINSTAL L="${COL60 }${BLUE}In stalling${ NORMAL}" | |
| 117 | SHOWSKIP=" ${COL60}${ WHITE}[${Y ELLOW} SKI P ${WHITE} ] ${NORMAL }" | |
| 118 | SHOWOK="${ COL60}${WH ITE}[${GRE EN} -OK- $ {WHITE}] $ {NORMAL}" | |
| 119 | SHOWDONE=" ${COL60}${ WHITE}[${G REEN} DONE ${WHITE}] ${NORMAL} " | |
| 120 | SHOWPASS=" ${COL60}${ WHITE}[${G REEN} PASS ${WHITE}] ${NORMAL} " | |
| 121 | SHOWISSUE= "${COL60}$ {WHITE}[${ YELLOW}ISS UE ${WHITE }] ${NORMA L}" | |
| 122 | SHOWFAIL=" ${COL60}${ WHITE}[${R ED} FAIL $ {WHITE}] $ {NORMAL}" | |
| 123 | # | |
| 124 | # LOGTXT s ends argum ents passe d to the d efined log file | |
| 125 | LOGTXT() { | |
| 126 | echo "$ *" >> ${LO GFILE} | |
| 127 | } | |
| 128 | # DEBUG se nds the ar guments pa ssed to th e terminal with an E OL at the end | |
| 129 | DEBUG() { | |
| 130 | if [ -t 1 ] ; the n echo -e "$*" ; fi | |
| 131 | } | |
| 132 | # EDEBUG s ends the a rguments p assed to t he termina l WITH NO EOL charac ter | |
| 133 | EDEBUG() { | |
| 134 | if [ -t 1 ] ; the n echo -en "$*" ; fi | |
| 135 | } | |
| 136 | ||
| 137 | # ReadArgs reads the command l ine argume nts passed to it | |
| 138 | # and polu lates shel l variable s accordin gly | |
| 139 | ReadArgs() { | |
| 140 | LOGTXT " Entered Re adArgs `da te`" | |
| 141 | while [[ $# -gt 0 ]] ; do | |
| 142 | key="$ 1" | |
| 143 | ||
| 144 | case $ {key} in | |
| 145 | -c | --nocolor ) | |
| 146 | UseColor= No | |
| 147 | CLEAR="" | |
| 148 | COL60="" | |
| 149 | NORMAL="" | |
| 150 | WHITE="" | |
| 151 | GREEN="" | |
| 152 | RED="" | |
| 153 | YELLOW="" | |
| 154 | BLUE="" | |
| 155 | shift # p ast argume nt | |
| 156 | LOGTXT "P rocessing without co lor" | |
| 157 | ;; | |
| 158 | -l | --logfile ) | |
| 159 | if [[ $# -ge 2 ]] ; then | |
| 160 | LOGFILE ="$2" | |
| 161 | else | |
| 162 | DEBUG " $1 argumen t requires another a rgument af ter it" | |
| 163 | LOGTXT "Error in $1 argumen t (no next argument provided)" | |
| 164 | exit 9 | |
| 165 | fi | |
| 166 | LOGTXT "U sing LogFi le ${LOGFI LE} instea d" | |
| 167 | # DEBUG "Log outpu t redirect ed to ${LO GFILE}" | |
| 168 | shift # p ast argume nt | |
| 169 | shift # p ast logfil e entry | |
| 170 | ;; | |
| 171 | -f | --fqdn ) | |
| 172 | if [[ $# -ge 2 ]] ; then | |
| 173 | MyFQDN= "$2" | |
| 174 | else | |
| 175 | DEBUG " argument $ 1 requires another a rgument af ter it" | |
| 176 | LOGTXT "Error in $1 argumen t (no next argument provided)" | |
| 177 | exit 9 | |
| 178 | fi | |
| 179 | LOGTXT "O verriding FQDN looku p. Using $ {MyFQDN} i nstead" | |
| 180 | # DEBUG "Overridin g FQDN loo kup. Using ${MyFQDN} instead" | |
| 181 | shift # p ast argume nt | |
| 182 | shift # p ast fqdn e ntry | |
| 183 | ;; | |
| 184 | -u | --user ) | |
| 185 | if [[ $# -ge 2 ]] ; then | |
| 186 | BBUSER= "$2" | |
| 187 | LOGTXT "Setting B itBucket U ser from C ommand Lin e" | |
| 188 | else | |
| 189 | DEBUG " argument $ 1 requires another a rgument af ter it" | |
| 190 | LOGTXT "Error in $1 argumen t (no next argument provided)" | |
| 191 | exit 9 | |
| 192 | fi | |
| 193 | shift # p ast argume nt | |
| 194 | shift # p ast user e ntry | |
| 195 | ;; | |
| 196 | -p | --pass | --password ) | |
| 197 | if [[ $# -ge 2 ]] ; then | |
| 198 | BBPASS= "$2" | |
| 199 | DEBUG " " | |
| 200 | LOGTXT "Setting B itBucket P assword fr om Command Line" | |
| 201 | else | |
| 202 | DEBUG " argument $ 1 requires another a rgument af ter it" | |
| 203 | LOGTXT "Error in $1 argumen t (no next argument provided)" | |
| 204 | exit 9 | |
| 205 | fi | |
| 206 | shift # p ast argume nt | |
| 207 | shift # p ast passwo rd entry | |
| 208 | ;; | |
| 209 | -v | --vpass | --vault | --vault-p assword ) | |
| 210 | if [[ $# -ge 2 ]] ; then | |
| 211 | JVPASS= "$2" | |
| 212 | LOGTXT "Setting J enkins Vau lt Passwor d from Com mand Line" | |
| 213 | else | |
| 214 | DEBUG " argument $ 1 requires another a rgument af ter it" | |
| 215 | LOGTXT "Error in $1 argumen t (no next argument provided)" | |
| 216 | exit 9 | |
| 217 | fi | |
| 218 | shift # p ast argume nt | |
| 219 | shift # p ast vault password e ntry | |
| 220 | ;; | |
| 221 | * ) DEBUG "$1 is not a valid argu ment" | |
| 222 | LOGTXT "$ 1 is not a valid arg ument" | |
| 223 | exit 9 | |
| 224 | ;; | |
| 225 | esac | |
| 226 | done | |
| 227 | LOGTXT " Exited Rea dArgs" | |
| 228 | } | |
| 229 | ||
| 230 | # DetectSy stem attem pts to ide ntify the system we' re on base d on IP ad dress | |
| 231 | # and PTR record (if any) | |
| 232 | DetectSyst em() { | |
| 233 | LOGTXT " Entering D etectSyste m `date`" | |
| 234 | EDEBUG " Detecting System IP: " | |
| 235 | # This m ethod uses our defin ed gateway to determ ine the IP address u sed | |
| 236 | # for ge tting out. .. in most cases, th is will be our prima ry IP addr ess | |
| 237 | Internet IP="`ip ro ute get 8. 8.8.8 | aw k '{print $NF; exit} '`" | |
| 238 | LOGTXT " InternetIP found to be ${Inter netIP}" | |
| 239 | # The ho stname -I option ret urns ALL I Ps (other than loopb ack) | |
| 240 | # In the EDE envir onment the re are oft en 2 inter faces | |
| 241 | IPs="`ho stname -I` " | |
| 242 | LOGTXT " List of al l IPs on o ur interfa ces is: ${ IPs}" | |
| 243 | MyIP=${I nternetIP} | |
| 244 | # | |
| 245 | # If we' ve been gi ven the FQ DN, don't bother det ecting it | |
| 246 | if [ ! - z "${MyFQD N}" ] ; th en | |
| 247 | LOGTXT "Using pr ovided FQD N ${MyFQDN } and rout able IP ${ MyIP}" | |
| 248 | EDEBUG "${WHITE} ${MyIP}${N ORMAL}" | |
| 249 | DEBUG "${SHOWOK} " | |
| 250 | # We wer en't told our FQDN, so we have to try to GET it | |
| 251 | # Since we're prim arily desi gned for o perating i n VA envir onments, t he | |
| 252 | # first way we try to determ ine our FQ DN (and IP ) is to tr y to get i t from | |
| 253 | # the VA DNS serve rs | |
| 254 | elif PTR=" `host ${My IP} ${VAMA GDNS1} |
|
|
| 255 | MyFQDN ="`echo ${ PTR} | sed 's/.* poi nter //'`" | |
| 256 | LOGTXT "${MyIP} has PTR of ${MyFQDN} from ${VA MAGDNS1}" | |
| 257 | EDEBUG "${WHITE} ${MyIP}${N ORMAL}" | |
| 258 | DEBUG "${SHOWOK} " | |
| 259 | # If our IP isn't listed in the VA DNS server (a nd it wasn 't provide d) | |
| 260 | # We hav e little c hoice (unt il HAC is created) b ut to assu me AWS | |
| 261 | elif PTR ="`host ${ MyIP} ${AW SCI} | gre p 'tas.loc al'`" ; th en | |
| 262 | MyFQDN ="`echo ${ PTR} | sed 's/.* poi nter //'`" | |
| 263 | LOGTXT "${MyIP} has PTR of ${MyFQDN} from AWS DNS" | |
| 264 | EDEBUG "${WHITE} ${MyIP}${N ORMAL}" | |
| 265 | DEBUG "${SHOWOK} " | |
| 266 | else | |
| 267 | LOGTXT "Failed t o determin e which IP to use" | |
| 268 | EDEBUG "${YELLOW }${IPs}${N ORMAL}" | |
| 269 | DEBUG "${SHOWISS UE}" | |
| 270 | exit 1 0 | |
| 271 | fi | |
| 272 | # | |
| 273 | # At thi s point we should ha ve defined MyFQDN an d MyIP | |
| 274 | # Lets v erify and set the My Hostname & MyDomain settings | |
| 275 | EDEBUG " Detecting System nam es: " | |
| 276 | if [ -z "${MyFQDN} " ] ; then | |
| 277 | LOGTXT "Failed t o find an FQDN: fix DNS/PTR or specifiy on the com mand line with -f" | |
| 278 | DEBUG "${SHOWFAI L}" | |
| 279 | DEBUG "Failed t o find you r FQDN in DNS" | |
| 280 | DEBUG " - Fix y our DNS (P TR) entrie s for this IP addres s, or" | |
| 281 | DEBUG " - use t he --fqdn option to force the value in t his script " | |
| 282 | exit 1 0 | |
| 283 | elif ! M yHostname= "`echo ${M yFQDN} | a wk -F. '{ print $1 } '`" ; then | |
| 284 | LOGTXT "Error ge tting host name from ${MyFQDN}" | |
| 285 | DEBUG "${SHOWFAI L}" | |
| 286 | DEBUG "Failed t o get a va lid hostna me from yo ur FQDN: $ {MyFQDN}" | |
| 287 | exit 1 0 | |
| 288 | elif ! M yDomain="` echo ${MyF QDN} | sed s/^${MyHo stname}\./ /`" ; then | |
| 289 | DEBUG "${SHOWFAI L}" | |
| 290 | DEBUG "Failed t o get a va lid domain name from your FQDN : ${MyFQDN }" | |
| 291 | LOGTXT "Error ge tting doma in from ${ MyFQDN}" | |
| 292 | exit 1 0 | |
| 293 | fi | |
| 294 | EDEBUG " ${WHITE}${ MyFQDN}${N ORMAL}" | |
| 295 | DEBUG "$ {SHOWOK}" | |
| 296 | ||
| 297 | # Next w e need to set the ho stname | |
| 298 | EDEBUG " Setting Ho stname to: " | |
| 299 | if ! hos tnamectl s et-hostnam e ${MyFQDN } ; then | |
| 300 | DEBUG "${SHOWFAI L}" | |
| 301 | DEBUG "Failed t o set host name to ${ MyFQDN} - Unknown ca use" | |
| 302 | LOGTXT "Error se tting host name to ${ MyFQDN}" | |
| 303 | exit 1 0 | |
| 304 | fi | |
| 305 | # Ensure that we h ave oursel ves listed in /etc/h osts | |
| 306 | if ! gre p -q ${MyI P} /etc/ho sts ; then | |
| 307 | echo $ {MyIP} ${M yHostname} ${MyFQDN} >> /etc/h osts | |
| 308 | fi | |
| 309 | EDEBUG " ${WHITE}${ MyFQDN}${N ORMAL}" | |
| 310 | DEBUG "$ {SHOWOK}" | |
| 311 | ||
| 312 | # Finall y we need to determi ne our env iroment: M AG, EDE, A WS, or HAC | |
| 313 | EDEBUG " Detected S ystem Envi ronment is : " | |
| 314 | if `echo $ {MyFQDN} |
|
|
| 315 | IsVA=Y es | |
| 316 | if [ "${MyHost name:2:3}" == "c20" ] ; then | |
| 317 | Depl oyEnv=MAG | |
| 318 | MyCIServer =http:// DNS . URL | |
| 319 | EDEB UG "${WHIT E}MAG${NOR MAL}" | |
| 320 | DEBU G "${SHOW OK}" | |
| 321 | elif [ "${MyHost name:2:3}" == "aus" ] ; then | |
| 322 | Depl oyEnv=EDE | |
| 323 | MyCIServer =http:// DNS . URL | |
| 324 | EDEB UG "${WHIT E}EDE${NOR MAL}" | |
| 325 | DEBU G "${SHOW OK}" | |
| 326 | else | |
| 327 | DEBU G "${SHOWF AIL}" | |
| 328 | DEBU G "Error determinin g VA insta ll environ ment -- ch eck hostna me" | |
| 329 | LOGT XT "Error determinin g VA insta ll environ ment -- ch eck hostna me" | |
| 330 | exit 10 | |
| 331 | fi | |
| 332 | if [ " ${MyHostna me:5:3}" = = "fpc" ] ; then | |
| 333 | IsCI Server=tru e | |
| 334 | fi | |
| 335 | # === | |
| 336 | # At som e point in the futur e, we will detect Ha lfaker Azu re Cloud e nv here | |
| 337 | # === | |
| 338 | elif `ec ho ${MyFQD N} | grep '.halfaker labs.com' > /dev/nul l 2>&1` ; then | |
| 339 | IsVA=N o | |
| 340 | Deploy Env=AWS | |
| 341 | MyCISe rver=http: //aws-mast er.mccf.ha lfakerlabs .com | |
| 342 | if [ " ${MyHostna me:4:6}" = = "master" ] ; then | |
| 343 | IsCI Server=tru e | |
| 344 | fi | |
| 345 | EDEBUG "${WHITE} AWS${NORMA L}" | |
| 346 | DEBUG "${SHOWOK }" | |
| 347 | elif `ec ho ${MyFQD N} | grep '.tas.loca l' > /dev/ null 2>&1` ; then | |
| 348 | IsVA=N o | |
| 349 | Deploy Env=AWS | |
| 350 | MyCISe rver=http: //aws-mast er.mccf.ha lfakerlabs .com | |
| 351 | if [ " ${MyHostna me:4:6}" = = "master" ] ; then | |
| 352 | IsCI Server=tru e | |
| 353 | fi | |
| 354 | EDEBUG "${WHITE} AWS${NORMA L}" | |
| 355 | DEBUG "${SHOWOK }" | |
| 356 | else | |
| 357 | DEBUG "${SHOWFAI L}" | |
| 358 | DEBUG "Error de termining Non-VA ins tall envir onment -- check doma in name" | |
| 359 | LOGTXT "Error de termining Non-VA ins tall envir onment -- check doma in name" | |
| 360 | exit 1 0 | |
| 361 | fi | |
| 362 | LOGTXT " ${MyIP} is ${MyHostn ame}.${MyD omain} in ${DeployEn v}" | |
| 363 | LOGTXT " DetectSyst em exited" | |
| 364 | } | |
| 365 | # Make use of ALL of the alloc ated stora ge! | |
| 366 | GrowFS() { | |
| 367 | LOGTXT " Entering G rowFS `dat e`" | |
| 368 | EDEBUG " Verifiying and Growi ng Filesys tems: " | |
| 369 | Err= | |
| 370 | # | |
| 371 | # Grow H ome to 10G B (from de fault 2GB) | |
| 372 | FSYS=/ho me | |
| 373 | SIZE=10G B | |
| 374 | EXTENT=" `df -h ${F SYS} | gre p ${FSYS} | awk '{ print $1 } '`" | |
| 375 | LOGTXT " Setting si ze of ${FS YS} (${EXT ENT}) to $ {SIZE}" | |
| 376 | EDEBUG " ${WHITE}${ FSYS} " | |
| 377 | if ! lve xtend -r - L ${SIZE} ${EXTENT} >> ${LOGFI LE} 2>&1 ; then | |
| 378 | LOGTXT "Error re turned fro m lvextend -- contin uing thoug h" | |
| 379 | DEBUG "\n${WHITE }Problem g rowing ${F SYS} to ${ SIZE}${SHO WISSUE}" | |
| 380 | Err=1 | |
| 381 | fi | |
| 382 | # | |
| 383 | # Grow O pt to 10GB (from def ault 2GB) | |
| 384 | FSYS=/op t | |
| 385 | SIZE=10G B | |
| 386 | EXTENT=" `df -h ${F SYS} | gre p ${FSYS} | awk '{ p rint $1 }' `" | |
| 387 | LOGTXT " Setting si ze of ${FS YS} (${EXT ENT}) to $ {SIZE}" | |
| 388 | EDEBUG " ${WHITE}${ FSYS} " | |
| 389 | if ! lve xtend -r - L ${SIZE} ${EXTENT} >> ${LOGFI LE} 2>&1 ; then | |
| 390 | LOGTXT "Error re turned fro m lvextend -- contin uing thoug h" | |
| 391 | DEBUG "\n${WHITE }Problem g rowing ${F SYS} to ${ SIZE}${SHO WISSUE}" | |
| 392 | Err=1 | |
| 393 | fi | |
| 394 | # | |
| 395 | # Grow V ar to 20GB (this is where web pages go!) | |
| 396 | FSYS=/va r | |
| 397 | SIZE=20G B | |
| 398 | EXTENT=" `df -h ${F SYS} | gre p ${FSYS} | awk '{ p rint $1 }' `" | |
| 399 | LOGTXT " Setting si ze of ${FS YS} (${EXT ENT}) to $ {SIZE}" | |
| 400 | EDEBUG " ${WHITE}${ FSYS} " | |
| 401 | if ! lve xtend -r - L ${SIZE} ${EXTENT} >> ${LOGFI LE} 2>&1 ; then | |
| 402 | LOGTXT "Error re turned fro m lvextend -- contin uing thoug h" | |
| 403 | DEBUG "\n${WHITE }Problem g rowing ${F SYS} to ${ SIZE}${SHO WISSUE}" | |
| 404 | Err=1 | |
| 405 | fi | |
| 406 | LOGTXT " GrowFS Exi ted `date` " | |
| 407 | if [ -z ${Err} ] ; then DEBU G "${SHOWO K}" ; fi | |
| 408 | } | |
| 409 | ||
| 410 | GetPackage s() { | |
| 411 | LOGTXT " Entering G etPackages `date`" | |
| 412 | # The pl aybooks th at complet e startup require An sible and are retrie ved with | |
| 413 | # GIT -- so we nee d to fetch them with YUM | |
| 414 | EDEBUG " Installing Pre-Insta ll Package s..." | |
| 415 | if ! yum install $ {PreInstal ledPkgs} - y --disabl erepo=\*mc cf\* >> ${ LOGFILE} 2 >&1 ; then | |
| 416 | DEBUG "${SHOWFAI L}" | |
| 417 | DEBUG "Failure installing Pre-Insta ll Package s - See Lo g File" | |
| 418 | LOGTXT "Failure installing Pre-Insta ll Package s" | |
| 419 | exit 1 5 | |
| 420 | fi | |
| 421 | DEBUG "$ {SHOWOK}" | |
| 422 | ||
| 423 | LOGTXT " Exiting Ge tPackages" | |
| 424 | } | |
| 425 | # | |
| 426 | # EnableJe nkinsAcess creates t he MCCF Je nkins user on the sy stem and | |
| 427 | # installs SSH KEY l evel acces s to it. W e also mak e sure tha t this | |
| 428 | # Jenkins user canno t login wi th any pas sword, but can with a key | |
| 429 | # Finally, we make t his Jenkin s user a S UDOer with no need f or a passw ord | |
| 430 | EnableJenk insAccess( ) { | |
| 431 | ||
| 432 | # Add the following for the Je nkins user account: | |
| 433 | # | |
| 434 | # /etc/sec urity/limi ts.d/99-je nkins.conf with cont ents: | |
| 435 | # Jenkins Baseline | |
| 436 | #jenkins - fs ize unlimi ted | |
| 437 | #jenkins - np roc 4096 | |
| 438 | #jenkins - me mlock 2048 | |
| 439 | #jenkins - no file 2048 | |
| 440 | #jenkins - st ack 16384 | |
| 441 | # | |
| 442 | # create t he /home/j enkins/.gi tconfig wi th content s. | |
| 443 | #[core] | |
| 444 | # c ompression = 0 | |
| 445 | # | |
| 446 | ||
| 447 | LOGTXT " Entering E nableJenki nsAccess" | |
| 448 | EDEBUG " Enabling M CCF Jenkin s user: " | |
| 449 | # Check if group e xists, and if not cr eate it | |
| 450 | EDEBUG " ${WHITE}Gr oup ${NORM AL}" | |
| 451 | if [ "`a wk -F: '{ print $1 } ' /etc/gro up | grep -c jenkins `" -eq 0 ] ; then | |
| 452 | if ! g roupadd -g ${JENKINS UID} ${JEN KINSUSER} >> ${LOGFI LE} 2>&1 ; then | |
| 453 | DEBU G "${SHOWF AIL}" | |
| 454 | DEBU G "Failed to add Jen kins group -- check error logs " | |
| 455 | exit 12 | |
| 456 | fi | |
| 457 | fi | |
| 458 | # Check if user ex ists, and if not cre ate it | |
| 459 | EDEBUG " ${WHITE}Us er ${NORMA L}" | |
| 460 | if [ "`a wk -F: '{ print $1 } ' /etc/pas swd | grep -c jenkin s`" -eq 0 ] ; then | |
| 461 | if ! u seradd -s ${JENKINSS HELL} -m - d ${JENKIN SHOME} -c "Jenkins A ccess Syst em Account " -u ${JEN KINSUID} - g ${JENKIN SUID} ${JE NKINSUSER} >> ${LOGF ILE} 2>&1 ; then | |
| 462 | DEBU G "${SHOWF AIL}" | |
| 463 | DEBU G "Failed to add Jen kins user -- check e rror logs" | |
| 464 | exit 12 | |
| 465 | fi | |
| 466 | fi | |
| 467 | # Create .ssh fold er | |
| 468 | EDEBUG " ${WHITE}.s sh ${NORMA L}" | |
| 469 | if [ ! - d ${JENKIN SHOME}/.ss h ] ; then | |
| 470 | if ! m kdir -p ${ JENKINSHOM E}/.ssh ; then | |
| 471 | DEBU G "${SHOWF AIL}" | |
| 472 | DEBU G "Failed to create Jenkins .s sh" | |
| 473 | exit 12 | |
| 474 | fi | |
| 475 | fi | |
| 476 | EDEBUG " ${WHITE}au th_key ${N ORMAL}" | |
| 477 | if [ ! - f ${JENKIN SHOME}/.ss h/authoriz ed_keys ] ; then | |
| 478 | echo $ {JENKINSPU B} > ${JEN KINSHOME}/ .ssh/autho rized_keys | |
| 479 | fi | |
| 480 | if ! /bi n/chown -R jenkins:j enkins ${J ENKINSHOME }/.ssh ; t hen | |
| 481 | DEBUG "${SHOWFAI L}" | |
| 482 | DEBUG "Failed to set owner for Jenki ns .ssh" | |
| 483 | exit 1 2 | |
| 484 | elif ! / bin/chmod 700 ${JENK INSHOME}/. ssh ; then | |
| 485 | DEBUG "${SHOWFAI L}" | |
| 486 | DEBUG "Failed to set permi ssions for Jenkins . ssh" | |
| 487 | exit 1 2 | |
| 488 | elif ! / bin/chmod 400 ${JENK INSHOME}/. ssh/author ized_keys ; then | |
| 489 | DEBUG "${SHOWFAI L}" | |
| 490 | DEBUG "Failed to set permi ssions for Jenkins k eys" | |
| 491 | exit 1 2 | |
| 492 | fi | |
| 493 | EDEBUG " ${WHITE}su do ${NORMA L}" | |
| 494 | JenkinsS udo=/etc/s udoers.d/j enkins | |
| 495 | if [ ! - f ${Jenkin sSudo} ] ; then | |
| 496 | echo " jenkins AL L=(ALL) NO PASSWD:ALL " > ${Jenk insSudo} | |
| 497 | chmod 400 ${Jenk insSudo} | |
| 498 | fi | |
| 499 | DEBUG "$ {SHOWOK}" | |
| 500 | LOGTXT " Exiting En ableJenkin sAccess" | |
| 501 | } | |
| 502 | ||
| 503 | # | |
| 504 | DeployYUMR epo() { | |
| 505 | LOGTXT " Entering D eployYUMRe po" | |
| 506 | EDEBUG " Downloadin g YUM Repo for CI Se rver..." | |
| 507 | STARTDIR ="`pwd`" | |
| 508 | # Clean out any pr ior git op eration fo r this pro ject | |
| 509 | if [ -d "${YUMDIR} " ] ; then rm -rf "$ {YUMDIR}" ; fi | |
| 510 | # Fetch the projec t using gi t with the provided credential s | |
| 511 | if ! git clone htt ps://${BBU SER}:${BBP ASS}@${YUM SRC} >> ${ LOGFILE} 2 >&1 ; then | |
| 512 | DEBUG "${SHOWFAI L}" | |
| 513 | DEBUG " Error ob taining pl aybook -- check the logfile @ ${LOGFILE} " | |
| 514 | DEBUG " However, the most likely err or is bad BitBucket permission s" | |
| 515 | LOGTXT "Sorry! g it clone f ailed..." | |
| 516 | exit 2 1 | |
| 517 | else | |
| 518 | DEBUG "${SHOWOK} " | |
| 519 | fi | |
| 520 | if [ ! - d "${YUMDI R}" ] ; th en | |
| 521 | DEBUG "${SHOWFAI L}" | |
| 522 | DEBUG " Error ac cessing fo lder `pwd` /${YUMDIR} " | |
| 523 | exit 2 1 | |
| 524 | elif [ ! -f "${YUM DIR}/${YUM SH}" ] ; t hen | |
| 525 | DEBUG "${SHOWFAI L}" | |
| 526 | DEBUG " Error ac cessing fi le `pwd`/$ {YUMDIR}/$ {YUMSH}" | |
| 527 | exit 2 1 | |
| 528 | fi | |
| 529 | cd "${YU MDIR}" | |
| 530 | EDEBUG " Deploying YUM Repo L ocally..." | |
| 531 | if ! ${Y UMSH} >> $ {LOGFILE} 2>&1 ; the n | |
| 532 | DEBUG "${SHOWFAI L}" | |
| 533 | DEBUG "YUM Insta ller Faile d -- check logs: ${L OGFILE}" | |
| 534 | exit 2 1 | |
| 535 | else | |
| 536 | DEBUG "${SHOWOK} " | |
| 537 | fi | |
| 538 | cd "${ST ARTDIR}" | |
| 539 | rm -rf " ${YUMDIR}" | |
| 540 | EDEBUG " Starting A pache HTTP service f or YUM rep o..." | |
| 541 | if ! yum install h ttpd -y -- disablerep o=\*mccf\* >> ${LOGF ILE} 2>&1 ; then | |
| 542 | DEBUG "${SHOWFAI L}" | |
| 543 | DEBUG "Apache ht tpd Instal ler Failed -- check logs: ${LO GFILE}" | |
| 544 | exit 2 1 | |
| 545 | elif ! s ystemctl e nable http d >> ${LOG FILE} 2>&1 ; then | |
| 546 | DEBUG "${SHOWFAI L}" | |
| 547 | DEBUG "Apache ht tpd Instal ler Failed -- check logs: ${LO GFILE}" | |
| 548 | exit 2 1 | |
| 549 | elif ! s ystemctl s tart httpd >> ${LOGF ILE} 2>&1 ; then | |
| 550 | DEBUG "${SHOWFAI L}" | |
| 551 | DEBUG "Apache ht tpd Startu p Failed - - check lo gs: ${LOGF ILE}" | |
| 552 | exit 2 1 | |
| 553 | elif ! f irewall-cm d --zone=p ublic --ad d-service= http --per manent >> ${LOGFILE} 2>&1 ; th en | |
| 554 | DEBUG "${SHOWFAI L}" | |
| 555 | DEBUG "Firewalld add for h ttpd Faile d -- check logs: ${L OGFILE}" | |
| 556 | exit 2 1 | |
| 557 | else | |
| 558 | DEBUG "${SHOWOK} " | |
| 559 | fi | |
| 560 | LOGTXT " Exiting De ployYUMRep o" | |
| 561 | } | |
| 562 | # | |
| 563 | # Subscrib eMCCFRepo | |
| 564 | SubscribeM CCFRepo() { | |
| 565 | LOGTXT " Entering S ubscribeMC CFRepo" | |
| 566 | EDEBUG " Subscribin g to addit ional YUM Repos: ${W HITE}MCCF ${NORMAL}" | |
| 567 | cat > /e tc/yum.rep os.d/mccf. repo << -E ND | |
| 568 | [mccf] | |
| 569 | name=Halfa ker MCCF D istributab le (to the VA) | |
| 570 | baseurl=${ MyCIServer }/pub/repo /yum/MCCF | |
| 571 | gpgcheck=1 | |
| 572 | gpgkey=${M yCIServer} /pub/repo/ yum/RPM-GP G-KEY-MCCF | |
| 573 | enabled=1 | |
| 574 | -END | |
| 575 | LOGTXT " Created mc cf.repo" | |
| 576 | if [ "${ DeployEnv} " == "AWS" ] ; then | |
| 577 | EDEBUG "${YELLOW }MCCF-VA $ {NORMAL}" | |
| 578 | cat >> /etc/yum. repos.d/mc cf.repo << -END | |
| 579 | [mccf-va] | |
| 580 | name=Halfa ker MCCF D ev Repo fo r VA suppl ied packag es | |
| 581 | baseurl=${ MyCIServer }/dev/repo /yum/MCCF- VA | |
| 582 | gpgcheck=1 | |
| 583 | gpgkey=${M yCIServer} /pub/repo/ yum/RPM-GP G-KEY-MCCF | |
| 584 | enabled=1 | |
| 585 | -END | |
| 586 | LOGTXT "Added mc cf-va to mccf.repo" | |
| 587 | EDEBUG "${YELLOW }MCCF-DEV ${NORMAL}" | |
| 588 | cat >> /etc/yum. repos.d/mc cf.repo << -END | |
| 589 | [mccf-dev] | |
| 590 | name=Halfa ker MCCF D ev Repo | |
| 591 | baseurl=${ MyCIServer }/dev/repo /yum/MCCF- DEV | |
| 592 | gpgcheck=1 | |
| 593 | gpgkey=${M yCIServer} /pub/repo/ yum/RPM-GP G-KEY-MCCF | |
| 594 | enabled=0 | |
| 595 | -END | |
| 596 | LOGTXT "Added mc cf-dev to mccf.repo " | |
| 597 | fi | |
| 598 | DEBUG "$ {SHOWOK}" | |
| 599 | LOGTXT " Exiting Su bscribeMCC FRepo" | |
| 600 | } | |
| 601 | # | |
| 602 | # InstallC I Server ( aka NFS or Master) | |
| 603 | DeployJenk ins() { | |
| 604 | LOGTXT " Entering D eployJenki ns" | |
| 605 | # | |
| 606 | # If Bit Bucket Use rname, Pas sword, or Vault Pass words are not provid ed... | |
| 607 | if [ -z "${BBUSER} " ] ; then | |
| 608 | EDEBUG "${WHITE} Please ent er your At lassian Bi tBucket Ac count User Name: ${Y ELLOW}" | |
| 609 | read B BUSER | |
| 610 | EDEBUG "${NORMAL }" | |
| 611 | fi | |
| 612 | if [ -z "${BBPASS} " ] ; then | |
| 613 | EDEBUG "${WHITE} Please ent er your pa ssword for the accou nt ${BBUSE R}: ${NORM AL}" | |
| 614 | read - s BBPASS | |
| 615 | DEBUG " " | |
| 616 | fi | |
| 617 | if [ -z "${JVPASS} " ] ; then | |
| 618 | EDEBUG "${WHITE} For CI Ser vers, plea se enter t he Jenkins Vault Pas sword: ${N ORMAL}" | |
| 619 | read - s JVPASS | |
| 620 | DEBUG " " | |
| 621 | fi | |
| 622 | EDEBUG " Setting Je nkins Vaul t Password s..." | |
| 623 | echo "${ JVPASS}" > ~root/.va ult_pass ; chmod 400 ~root/ .vault_pas s | |
| 624 | echo "${ JVPASS}" > ~jenkins/ .vault_pas s ; chmod 400 ~jenki ns/.vault_ pass ; cho wn -R jenk ins:jenkin s ~jenkins /.vault_pa ss | |
| 625 | DEBUG "$ {SHOWOK}" | |
| 626 | EDEBUG " Getting Je nkins Repo for CI Se rver..." | |
| 627 | STARTDIR ="`pwd`" | |
| 628 | # Clean out any pr ior git op eration fo r this pro ject | |
| 629 | if [ -d "${JENKINS DIR}" ] ; then rm -r f "${JENKI NSDIR}" ; fi | |
| 630 | # Fetch the projec t using gi t with the provided credential s | |
| 631 | if ! git clone htt ps://${BBU SER}:${BBP ASS}@${JEN KINSSRC} > > ${LOGFIL E} 2>&1 ; then | |
| 632 | DEBUG "${SHOWFAI L}" | |
| 633 | DEBUG " Error ob taining pl aybook -- check the logfile @ ${LOGFILE} " | |
| 634 | exit 2 1 | |
| 635 | else | |
| 636 | DEBUG "${SHOWOK} " | |
| 637 | fi | |
| 638 | EDEBUG " Running Je nkins Repo Installer ..." | |
| 639 | if [ ! - d "${JENKI NSDIR}" ] ; then | |
| 640 | DEBUG "${SHOWFAI L}" | |
| 641 | DEBUG " Error ac cessing fo lder `pwd` /${JENKINS DIR}" | |
| 642 | exit 2 1 | |
| 643 | elif [ ! -f "${JEN KINSDIR}/$ {JENKINSSH }" ] ; the n | |
| 644 | DEBUG "${SHOWFAI L}" | |
| 645 | DEBUG " Error ac cessing fi le `pwd`/$ {JENKINSDI R}/${JENKI NSSH}" | |
| 646 | exit 2 1 | |
| 647 | fi | |
| 648 | cd "${JE NKINSDIR}" | |
| 649 | if ${JEN KINSSH} >> ${LOGFILE } 2>&1 ; t hen | |
| 650 | DEBUG "${SHOWOK} " | |
| 651 | else | |
| 652 | DEBUG "${SHOWFAI L}" | |
| 653 | DEBUG "Jenkins R epo Instal ler Failed -- check logs: ${LO GFILE}" | |
| 654 | exit 2 1 | |
| 655 | fi | |
| 656 | cd "${ST ARTDIR}" | |
| 657 | rm -rf " ${JENKINSD IR}" | |
| 658 | # | |
| 659 | EDEBUG " Getting De vOps Repo for CI Ser ver..." | |
| 660 | # Clean out any pr ior git op eration fo r this pro ject | |
| 661 | if [ -d "${DEVOPSD IR}" ] ; t hen rm -rf "${DEVOPS DIR}" ; fi | |
| 662 | # Fetch the projec t using gi t with the provided credential s | |
| 663 | if ! git clone htt ps://${BBU SER}:${BBP ASS}@${DEV OPSSRC} >> ${LOGFILE } 2>&1 ; t hen | |
| 664 | DEBUG "${SHOWFAI L}" | |
| 665 | DEBUG " Error ob taining pl aybook -- check the logfile @ ${LOGFILE} " | |
| 666 | exit 2 1 | |
| 667 | else | |
| 668 | DEBUG "${SHOWOK} " | |
| 669 | fi | |
| 670 | EDEBUG " Running De vops Jenki ns Install er..." | |
| 671 | if [ ! - d "${DEVOP SDIR}" ] ; then | |
| 672 | DEBUG "${SHOWFAI L}" | |
| 673 | DEBUG " Error ac cessing fo lder `pwd` /${DEVOPSD IR}" | |
| 674 | exit 2 1 | |
| 675 | elif [ ! -d "${DEV OPSDIR}/${ DEVOPSDIR2 }" ] ; the n | |
| 676 | DEBUG "${SHOWFAI L}" | |
| 677 | DEBUG " Error ac cessing fo lder `pwd` /${DEVOPSD IR}/${DEVO PSDIR2}" | |
| 678 | exit 2 1 | |
| 679 | else | |
| 680 | cd "${ DEVOPSDIR} /${DEVOPSD IR2}" | |
| 681 | if [ ! -f "${DEV OPSSH}" ] ; then | |
| 682 | DEBU G "${SHOWF AIL}" | |
| 683 | DEBU G " Error accessing file `pwd` /${DEVOPSS H}" | |
| 684 | exit 21 | |
| 685 | fi | |
| 686 | fi | |
| 687 | # | |
| 688 | # | |
| 689 | # THIS HAS TO BE HAS HED OUT BE FORE RUNNI NG ANYWHER E ELSE BUT MAG | |
| 690 | # | |
| 691 | # | |
| 692 | if ${DEV OPSSH} -e MAG_DEV -u ${BBUSER} -p ${BBPA SS} -l /va r/log/${DE VOPSSH}.lo g >> ${LOG FILE} 2>&1 ; then | |
| 693 | DEBUG "${SHOWOK} " | |
| 694 | else | |
| 695 | DEBUG "${SHOWFAI L}" | |
| 696 | DEBUG " Installe r Failed - - check lo gs: ${LOGF ILE}" | |
| 697 | exit 2 1 | |
| 698 | fi | |
| 699 | cd "${ST ARTDIR}" | |
| 700 | rm -rf " ${DEVOPSDI R}" | |
| 701 | DEBUG "$ {SHOWOK}" | |
| 702 | LOGTXT " Exiting De ployJenkin s" | |
| 703 | } | |
| 704 | # | |
| 705 | # | |
| 706 | # | |
| 707 | # THIS IS THE START OF ACTUAL PROCESSING | |
| 708 | # | |
| 709 | # | |
| 710 | ||
| 711 | LOGTXT "St arting $0 at `date`" | |
| 712 | EDEBUG ${C LEAR} | |
| 713 | DEBUG "Wel come to th e TAS Syst em Prepara tion Scrip t." | |
| 714 | DEBUG "We need to co nfirm and/ or set som e things u p before w e can inte grate" | |
| 715 | DEBUG "thi s system i nto TAS. P lease pay close atte ntion to t he output below:" | |
| 716 | DEBUG "Add itionally, a log fil e is creat ed at ${LO GFILE}" | |
| 717 | DEBUG " " | |
| 718 | ||
| 719 | ReadArgs $ * | |
| 720 | DetectSyst em | |
| 721 | GrowFS | |
| 722 | EnableJenk insAccess | |
| 723 | GetPackage s | |
| 724 | if [ ! -z ${IsCIServ er} ] ; th en | |
| 725 | DeployYU MRepo | |
| 726 | Subscrib eMCCFRepo | |
| 727 | DeployJe nkins | |
| 728 | else | |
| 729 | Subscrib eMCCFRepo | |
| 730 | fi | |
| 731 | ||
| 732 | DEBUG "All done... e verything passed. Re booting sy stem in 30 seconds f or initial use" | |
| 733 | DEBUG "Pre ss CTRL-C to abort t he reboot" | |
| 734 | LOGTXT "Co mpleted $0 at `date` " | |
| 735 | sleep 30 | |
| 736 | PARENT="`p wd | sed ' s#/mccf_de vops/.*#/# '`" | |
| 737 | echo $PARE NT | |
| 738 | cd "${PARE NT}" | |
| 739 | rm -rf mcc f_devops | |
| 740 | init 6 |
Araxis Merge (but not the data content of this report) is Copyright © 1993-2016 Araxis Ltd (www.araxis.com). All rights reserved.