forked from jhtran/stackjump
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstackjump
More file actions
executable file
·283 lines (248 loc) · 7.78 KB
/
stackjump
File metadata and controls
executable file
·283 lines (248 loc) · 7.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
#!/bin/bash
# password hash to set for 'ubuntu' user account on install
# default set to 'none' spelled out
source stackjump.config
MYPASSWD=${UBUNTU_PWHASH:-'$6$Cjxz1rgM$ahShoUXrRY0qabPBMuFSmxRcwqkA2BRmb0B9Dlkzd5BfiunORoayXm3RZCEAsauW50JES9v1GTkkurnXmv8Ey0'}
MYKNIFEPASSWD=${KNIFE_PWSTR:-mypassword}
MYNODENAME=${NODE_NAME:-myjumpnode}
MYDOMAINNAME=${DOMAIN_NAME:-mydomain.com}
MYCHEFCLIENTVER=${CHEF_CLIENT_VER:-11.8.0-1}
MYCHEFSERVERVER=${CHEF_SERVER_VER:-11.0.8-1}
MYDEFAULTNIC=${DEFAULT_NIC:-eth0}
WHOAMI=`whoami`
if [ $WHOAMI != "root" ]; then
echo "Must be run as sudo root"
exit 1
fi
USAGE="$0 options
-d dry run don't create iso
-c chef repo dir
-a architecture [i386|amd64]
-r release_codename (oneiric, natty, maverick, etc)
-v release_version
-rl chef run list for jump node (comma delimited)
-o output iso
-V verbose
-t tmpdir
-k keep tmp dir"
while [ $1 ];do
case $1 in
-d) shift
DRYRUN=1;;
-c) shift
CHEFREPO=$1;;
-a) shift
ARCH=$1;;
-r) shift
REL=$1;;
-v) shift
VER=$1;;
-o) shift
ISO=$1;;
-rl) shift
CHEFRUNLIST=$1;;
-k) shift
KEEP=1;;
-t) shift
TMPDIR=$1;;
-V) shift
VERBOSE=1;;
*) echo "$USAGE" && exit 1;;
esac
shift
done
echo -e "\n!! This tool should only be run on a Linux workstation !!"
echo "!! This code is customized for AT&T environment usage only !!"
echo -e "!! So far only tested on Precise Pangolin 12.04.3 x64 !!\n"
if [ ! $REL ]; then
REL='precise'
fi
MYTMPDIR=${TMPDIR:-/tmp/stackjump}
ISODIR="$MYTMPDIR/ISO"
ISODIR_EXTRAS="$ISODIR/extras"
INITRD="$MYTMPDIR/initrd"
DOWNLOADS="$MYTMPDIR/DOWNLOADS"
MOUNTDIR="$MYTMPDIR/mount"
EXTRAS="$INITRD/extras"
CUSTOM_SCRIPTSD="$ISODIR_EXTRAS/custom_scripts"
MYCHEFREPO="$ISODIR_EXTRAS/chef-repo"
for DIR in $MYTMPDIR $DOWNLOADS $ISODIR $INITRD $MOUNTDIR $CUSTOM_SCRIPTSD $MYCHEFREPO/cookbooks $MYCHEFREPO/roles; do
if [ ! -d $DIR ]; then
mkdir -p $DIR
fi
done
## SANITY CHECKS ##
for BIN in fakeroot cpio mkisofs curl; do
if [ ! `which $BIN` ]; then
echo "$BIN needs to be installed to run stackjump" && exit 1
exit 1
fi
done
if [ ! $ISO ]; then
ISO='custom.iso'
fi
if [ ! $ARCH ]; then
ARCH=`arch`
fi
case $ARCH in
'i686') ARCH='i386';;
'x86_64') ARCH='amd64';;
esac
if [ $ARCH != 'i386' ] && [ $ARCH != 'amd64' ]; then
echo "Architecture $ARCH is not valid. (amd64|i386)" && exit 1
fi
if [ ! $VER]; then
VER='12.04.3'
fi
DISTURL="http://releases.ubuntu.com"
ISONAME="ubuntu-$VER-server-$ARCH.iso"
ISOURL="$DISTURL/$REL/$ISONAME"
HEAD=`curl -s --head $ISOURL|head -1`
HCODE=`expr "$HEAD" : 'HTTP\/... \(...\) '`
if [ "$HCODE" != '200' ]; then
echo "Release $REL invalid."
echo "Check $ISOURL to make sure a valid release codename" && exit 1
fi
### MAKING THE ISO ##
if [ -f "$DOWNLOADS/$ISONAME" ]; then
echo -e "\n$DOWNLOADS/$ISONAME exists - skipping download\n"
else
echo -e "\nDownloading $ISOURL to $DOWNLOADS/$ISONAME\n"
curl $ISOURL -o $DOWNLOADS/$ISONAME
fi
if [ -d $MOUNTDIR/isolinux ]; then
echo -e "\nISO already mounted $MOUNTDIR - skipping mount\n"
else
echo -e "\nMounting to $MOUNTDIR...\n"
mount -r -o loop $DOWNLOADS/$ISONAME $MOUNTDIR
fi
echo -e "\nCopying contents of $ISONAME to $ISODIR\n"
if [ $VERBOSE ]; then
rsync -av $MOUNTDIR/ $ISODIR/
else
rsync -av $MOUNTDIR/ $ISODIR/ > /dev/null 2>&1
fi
if [ $VERBOSE ]; then
(cd $INITRD && gunzip -c $MOUNTDIR/install/initrd.gz| fakeroot cpio -id )
else
(cd $INITRD && gunzip -c $MOUNTDIR/install/initrd.gz| fakeroot cpio -id ) > /dev/null 2>&1
fi
echo -e "\nCUSTOMIZING ISOLINUX.cfg\n"
cat>"$ISODIR/isolinux/isolinux.cfg"<<EOF
prompt 0
timeout 2
menu hshift 13
menu width 49
menu margin 8
default autoinstall
label autoinstall
MENU LABEL AUTOMATED INSTALL
kernel /install/vmlinuz
append auto ramdisk_size=14984 initrd=/install/initrd.gz vga=normal DEBCONF_DEBUG=5
EOF
echo -e "\nINJECTING PRESEED AND CUSTOM SCRIPTS\n"
cat preseed.cfg | sed "s/MYPASSWD/$MYPASSWD/" | sed "s/MYNODENAME/$MYNODENAME/" |\
sed "s/MYDOMAIN/$MYDOMAIN/" | sed "s/MYDEFAULTNIC/$MYDEFAULTNIC/" > $INITRD/preseed.cfg
for HDIR in "root" "home/ubuntu"; do
if [ ! -d "$EXTRAS/$HDIR/.ssh" ]; then
mkdir -p "$EXTRAS/$HDIR/.ssh"
fi
cp authorized_keys $EXTRAS/$HDIR/.ssh/authorized_keys
done
cp first_run.sh late_command.sh $EXTRAS/root
if [ $VERBOSE ]; then
rsync -av custom_scripts/ $CUSTOM_SCRIPTSD/
else
rsync -av custom_scripts/ $CUSTOM_SCRIPTSD/ > /dev/null 2>&1
fi
cat knife_first_run | sed "s/MYPASSWORD/$MYKNIFEPASSWD/g" |\
sed "s/MYJUMPNODE/${MYNODENAME}_admin/g" > $EXTRAS/root/knife_first_run
# DOWNLOAD LATEST CHEF OMNIBUS PACKAGES
OMNIBUS_URL="https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu"
IFS=. read -r maj min _ <<< "$VER"
OMNI_VER="$maj.$min"
# Only available in x86_64
OMNI_ARCH="x86_64"
CHEFCLIENT="chef_$MYCHEFCLIENTVER.ubuntu.${OMNI_VER}_${ARCH}.deb"
CHEFC_URL="$OMNIBUS_URL/$OMNI_VER/$OMNI_ARCH/$CHEFCLIENT"
if [ -f $DOWNLOADS/$CHEFCLIENT ]; then
echo -e "\n$DOWNLOADS/$CHEFCLIENT exists - skipping chef client download\n"
else
echo -e "\nDownloading CHEF-CLIENT OMNIBUS $DOWNLOADS/$CHEFCLIENT\n"
curl $CHEFC_URL -o $DOWNLOADS/$CHEFCLIENT
fi
cp $DOWNLOADS/$CHEFCLIENT $ISODIR_EXTRAS/$CHEFCLIENT
CHEFSERVER="chef-server_$MYCHEFSERVERVER.ubuntu.${OMNI_VER}_${ARCH}.deb"
CHEFS_URL="$OMNIBUS_URL/$OMNI_VER/$OMNI_ARCH/$CHEFSERVER"
if [ -f $DOWNLOADS/$CHEFSERVER ]; then
echo -e "\n$DOWNLOADS/$CHEFSERVER exists - skipping chef server download\n"
else
echo -e "\nDownloading CHEF-SERVER OMNIBUS $DOWNLOADS/$CHEFSERVER\n"
curl $CHEFS_URL -o $DOWNLOADS/$CHEFSERVER
fi
cp $DOWNLOADS/$CHEFSERVER $ISODIR_EXTRAS/$CHEFSERVER
## IMPORT THE CHEF REPO
if [ ! -z $CHEFREPO ] && [ -d $CHEFREPO ]; then
echo -e "\nCOPYING EXTRAS $CHEFREPO...\n"
if [ $VERBOSE ]; then
rsync -av $CHEFREPO/ $MYCHEFREPO/
else
rsync -av $CHEFREPO/ $MYCHEFREPO/ > /dev/null 2>&1
fi
fi
BASE_COOKBOOKS="chef-client logrotate cron"
for i in $BASE_COOKBOOKS; do
COOKBOOKD="$MYCHEFREPO/cookbooks/$i"
if [ ! -f "$COOKBOOKD/README.md" ]; then
if [ ! -d "$COOKBOOKD" ]; then
mkdir -p $COOKBOOKD
fi
if [ -f "$DOWNLOADS/$i/README.md" ]; then
echo -e "\n$DOWNLOADS/$i cookbook already exists - skipping download\n"
else
echo -e "\nDownloading $i cookbook from github\n"
OUTPUT=`(cd $MYTMPDIR; curl -kLs https://github.com/opscode-cookbooks/$i/tarball/master | tar -zxv)`
DLTMP="$MYTMPDIR/`echo $OUTPUT|awk '{print $1}'`"
mv $DLTMP $DOWNLOADS/$i
fi
if [ $VERBOSE ]; then
rsync -av $DOWNLOADS/$i/ $COOKBOOKD/
else
rsync -av $DOWNLOADS/$i/ $COOKBOOKD/ > /dev/null 2>&1
fi
else
echo -e "\n$COOKBOOKD cookbook already exists - skipping download\n"
fi
done
# BUILD INITRD.GZ
echo -e "\nBUILDING INITRD.GZ...\n"
if [ $VERBOSE ]; then
(cd $INITRD ; find . | cpio -H newc --create | gzip -9 > $ISODIR/install/initrd.gz)
else
(cd $INITRD ; find . | cpio -H newc --create | gzip -9 > $ISODIR/install/initrd.gz) > /dev/null 2>&1
fi
# CREATE ISO
if [ $DRYRUN ]; then
echo -e "\nDRYRUN - skipping ISO creation\n"
else
echo -e "\nBUILDING THE ISO IMAGE...\n"
if [ $VERBOSE ]; then
mkisofs -r -V "Custom Auto Ubuntu Install" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o $ISO $ISODIR
else
mkisofs -quiet -r -V "Custom Auto Ubuntu Install" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o $ISO $ISODIR
fi
fi
# CLEANUP
if [ ! $KEEP ]; then
umount $MOUNTDIR
rm -rf $INITRD $ISODIR $MOUNTDIR
fi
if [ ! -f $ISO ]; then
echo "Create ISO failed." && exit 1
else
if [ $DRYRUN ]; then
echo -e "\nsuccessfully completed\n" && exit 0
else
echo -e "\n$ISO successfully created\n" && exit 0
fi
fi