forked from Byzantium/Byzantium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild-final-module.sh
executable file
·265 lines (223 loc) · 10 KB
/
build-final-module.sh
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
#!/bin/sh
# Byzantium Linux top level build script.
# by: Sitwon
# This shell script, when executed inside of a Porteus build machine, will
# result in the generation of the file 000-byzantium.xzm.
# Copyright (C) 2013 Project Byzantium
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
# Bail on errors
set -e
FAKE_ROOT=${FAKE_ROOT:-/tmp/fakeroot}
BUILD_HOME=${BUILD_HOME:-/home/guest}
OUTPUT=${OUTPUT:-/tmp}
# clean $FAKE_ROOT if true
CLEAN_FAKE_ROOT=true
# set true to run http_placeholder.sh to add the web service placeholder pages
#HTTP_PLACEHOLDER=true
if_def(){
# if $1 is defined include $2 inline (execute it's contents in the
# current scope)
if [ -n "$1" ] ;then
. $2
fi
}
is_user(){
####### check if user exists: function for build machines
## @param $1 user[:group]
## @param $2 UID[:GID]
## @return 0|1 where 0 is
#################################################
# check for user and if it does not exist create it with the UID passed to this function
user=${1//[\.\:]*/} #username
uid=${2//[\.\:]*/} #uid
grptmp=${1//*[\.\:]/} #temporary value for getting the groupname
gidtmp=${2//*[\.\:]/} #temporary value for getting the gid
group=${grptmp//$user/} #groupname or ''
gid=${gidtmp//$uid/} #gid or ''
if [ $group ] ;then
if [[ `grep -e "^${group}:" /etc/group` == '' ]] ;then
echo "creating group ${group} with gid ${gid}"
groupadd -g $gid $group
fi
if [[ `grep -e "^${user}:" /etc/passwd` == '' ]] ;then
echo "creating user ${user} with uid ${uid} and gid ${gid}"
useradd -u ${uid} -g $gid $user
fi
elif [[ `grep -e "^${user}:" /etc/passwd` == '' ]] ;then
echo "creating user ${user} with uid ${uid}"
useradd -u ${uid} ${user}
fi
}
safe_chown(){
is_user $1 $2
chown ${1} ${*:3}
}
# Create the fakeroot.
cd $BUILD_HOME/Byzantium
echo "Deleting and recreating the fakeroot..."
if $CLEAN_FAKE_ROOT ;then
read -p "Rebuilding fakeroot, okay? [press enter to continue]" rebuild
rm -rf ${FAKE_ROOT}
mkdir -p ${FAKE_ROOT}
# Test to see if the Byzantium SVN repository has been checked out into the
# home directory of the guest user. ABEND if it's not.
if [ ! -d $BUILD_HOME/byzantium ]; then
echo "ERROR: Byzantium SVN package repository not found in $BUILD_HOME."
exit 1
fi
# Unpack all of the .xzm packages into the fakeroot to populate it with the
# libraries and executables under the hood of Byzantium.
for i in $(cat required_packages.txt | grep -v '^#') ; do
echo "Now installing $i to ${FAKE_ROOT}..."
xzm2dir $BUILD_HOME/byzantium/$i ${FAKE_ROOT}
echo "Done."
done
# The thing about symlinks is that they're absolute. When you're building in
# a fakeroot this breaks things. So, we have to set up the web server's
# content directories manually.
echo "Deleting bad symlinks to httpd directories."
rm ${FAKE_ROOT}/srv/httpd
rm ${FAKE_ROOT}/srv/www
else
echo "Skipping fakeroot rebuild."
fi # end if $CLEAN_FAKE_ROOT
echo "Creating database and web server content directories."
mkdir -p ${FAKE_ROOT}/srv/httpd/htdocs
if_def "$HTTP_PLACEHOLDER" ${BUILD_HOME}/Byzantium/http_placeholder.sh # conditionally run the script at arg 2
mkdir -p ${FAKE_ROOT}/srv/httpd/cgi-bin
mkdir -p ${FAKE_ROOT}/srv/httpd/databases
cd ${FAKE_ROOT}/srv
ln -s httpd www || echo -n
# We should build a controlpanel module to obviate these steps.
echo "Creating directories for the traffic graphs."
mkdir -p ${FAKE_ROOT}/srv/controlpanel/graphs
#echo "Copying control panel's HTML templates into place."
#cp -rv $BUILD_HOME/Byzantium/control_panel/srv/controlpanel/* ${FAKE_ROOT}/srv/controlpanel
#echo "Installing control panel config files."
#mkdir -p ${FAKE_ROOT}/etc/controlpanel
#cp $BUILD_HOME/Byzantium/control_panel/etc/controlpanel/* ${FAKE_ROOT}/etc/controlpanel
#echo "Installing control panel's SQLite databases and schemas."
#mkdir -p ${FAKE_ROOT}/var/db/controlpanel
#cp -rv $BUILD_HOME/Byzantium/control_panel/var/db/controlpanel/* ${FAKE_ROOT}/var/db/controlpanel
# Create the xdg directory tree and populate it with our wicd disabler.
#echo "Creating desktop environment autostart directories."
#mkdir -p ${FAKE_ROOT}/etc/xdg/autostart/
#mkdir -p ${FAKE_ROOT}/usr/share/autostart/
#cp -rv $BUILD_HOME/Byzantium/porteus/etc/xdg/autostart/wicd-tray.desktop ${FAKE_ROOT}/etc/xdg/autostart
#cp -rv $BUILD_HOME/Byzantium/porteus/usr/share/autostart/wicd-tray.desktop ${FAKE_ROOT}/usr/share/autostart
cd $BUILD_HOME/Byzantium/scripts
# Could these be placed in a module?
echo "Installing custom initscripts."
cp rc.local rc.mysqld rc.ssl rc.setup_mysql rc.M rc.services ${FAKE_ROOT}/etc/rc.d
chmod +x ${FAKE_ROOT}/etc/rc.d/rc.*
# Set up mDNS service descriptor repository.
mkdir -p ${FAKE_ROOT}/etc/avahi/inactive
# Configure libnss to reference mDNS for resolution in addition to DNS.
#cp ${FAKE_ROOT}/etc/nsswitch.conf-mdns ${FAKE_ROOT}/etc/nsswitch.conf
# This stuff probably belongs in the controlpanel package.
echo "Installing rrdtool shell script."
mkdir -p ${FAKE_ROOT}/usr/local/bin
cp traffic_stats.sh ${FAKE_ROOT}/usr/local/bin
echo "Installing the control panel."
cd ../control_panel
mkdir -p ${FAKE_ROOT}/usr/local/sbin
cp *.py *.sh ${FAKE_ROOT}/usr/local/sbin
cp etc/rc.d/rc.byzantium ${FAKE_ROOT}/etc/rc.d/
echo "Installing OpenSSL configuration file."
mkdir -p ${FAKE_ROOT}/etc/ssl
cp etc/ssl/openssl.cnf ${FAKE_ROOT}/etc/ssl
# Install the CGI-BIN script that implements the service directory the users
# see.
echo "Installing the service directory."
cd ../service_directory
cp index.html ${FAKE_ROOT}/srv/httpd/htdocs
cp -r services.py _services.py _utils.py tmpl ${FAKE_ROOT}/srv/httpd/cgi-bin
chmod 0755 ${FAKE_ROOT}/srv/httpd/cgi-bin/services.py
mkdir -p ${FAKE_ROOT}/opt/byzantium/avahi/
cp avahiclient.sh avahiclient.py _utils.py ${FAKE_ROOT}/opt/byzantium/avahi/
chmod -R 0755 ${FAKE_ROOT}/opt/byzantium/avahi/
cp rc.avahiclient ${FAKE_ROOT}/etc/rc.d/
chmod 0755 ${FAKE_ROOT}/etc/rc.d/rc.avahiclient
# Add the custom Firefox configuration.
echo "Installing Mozilla configs for the guest user."
cd ..
mkdir -p ${FAKE_ROOT}/home/guest/.mozilla/firefox/c3pp43bg.default
cp home/guest/.mozilla/firefox/c3pp43bg.default/prefs.js ${FAKE_ROOT}/home/guest/.mozilla/firefox/c3pp43bg.default
# Create the KDE Autostart directory and copy the success/failure testing
# script into it.
mkdir -p ${FAKE_ROOT}/home/guest/.trinity/Autostart
cp verify_operation.sh ${FAKE_ROOT}/home/guest/.trinity/Autostart/
chmod 0755 ${FAKE_ROOT}/home/guest/.trinity/Autostart/
# Why aren't these in their modules?
echo "Installing custom configuration files and initscripts for services."
cp -rv apache/etc/httpd/* ${FAKE_ROOT}/etc/httpd
#cp babel/babeld.conf ${FAKE_ROOT}/etc
cp packages/dnsmasq/dnsmasq.conf ${FAKE_ROOT}/etc
cp etherpad-lite/rc.etherpad-lite ${FAKE_ROOT}/etc/rc.d
cp etherpad-lite/settings.json ${FAKE_ROOT}/opt/etherpad-lite
cp etherpad-lite/etherpad-lite.service ${FAKE_ROOT}/etc/avahi/inactive
cp sudo/etc/sudoers ${FAKE_ROOT}/etc
chown root:root ${FAKE_ROOT}/etc/sudoers
chmod 0440 ${FAKE_ROOT}/etc/sudoers
#cp avahi/etc/avahi/avahi-daemon.conf ${FAKE_ROOT}/etc/avahi
cp etc/profile ${FAKE_ROOT}/etc
# Install our custom avahi-dnsconfd.action script.
#cp avahi/etc/avahi/avahi-dnsconfd.action ${FAKE_ROOT}/etc/avahi
# Add the custom passwd and group files.
echo "Installing custom system configuration files."
cp etc/passwd ${FAKE_ROOT}/etc
cp etc/shadow ${FAKE_ROOT}/etc
cp etc/hosts ${FAKE_ROOT}/etc
cp etc/HOSTNAME ${FAKE_ROOT}/etc
cp etc/inittab ${FAKE_ROOT}/etc
cp etc/group ${FAKE_ROOT}/etc
chown root:root ${FAKE_ROOT}/etc/passwd ${FAKE_ROOT}/etc/shadow ${FAKE_ROOT}/etc/hosts ${FAKE_ROOT}/etc/HOSTNAME ${FAKE_ROOT}/etc/inittab ${FAKE_ROOT}/etc/group
chmod 0600 ${FAKE_ROOT}/etc/shadow
# These belong in modules!
echo "Installing config files for MySQL, ngircd, and PHP."
cp mysql/my.cnf ${FAKE_ROOT}/etc
cp packages/ngircd/ngircd.conf ${FAKE_ROOT}/etc
cp packages/ngircd/ngircd.service ${FAKE_ROOT}/etc/avahi/inactive
cp packages/ngircd/rc.ngircd ${FAKE_ROOT}/etc/rc.d
#cp php/etc/httpd/php.ini ${FAKE_ROOT}/etc/httpd
# This should be a module
echo "Installing qwebirc configuration file and initscript."
mkdir -p ${FAKE_ROOT}/opt/qwebirc
cp qwebirc/config.py ${FAKE_ROOT}/opt/qwebirc
cp qwebirc/rc.qwebirc ${FAKE_ROOT}/etc/rc.d
cp qwebirc/qwebirc.service ${FAKE_ROOT}/etc/avahi/inactive
# Install the database files.
echo "Installing database files."
cp databases/* ${FAKE_ROOT}/srv/httpd/databases
# Add our custom desktop stuff.
echo "Customizing desktop for guest user."
mkdir -p ${FAKE_ROOT}/home/guest/Desktop
#cp porteus/home/guest/Desktop/Control\ Panel.desktop ${FAKE_ROOT}/home/guest/Desktop
#mkdir -p ${FAKE_ROOT}/usr/share/pixmaps/porteus
#cp byzantium-icon.png ${FAKE_ROOT}/usr/share/pixmaps/porteus
# Create the runtime directory for ngircd because its package doesn't.
echo "Setting up directories for ngircd."
mkdir -p ${FAKE_ROOT}/var/run/ngircd
safe_chown ngircd:root 1002:0 ${FAKE_ROOT}/var/run/ngircd
chmod 0750 ${FAKE_ROOT}/var/run/ngircd
# Install the captive portal daemon.
echo "Installing captive portal."
mkdir -p ${FAKE_ROOT}/srv/captiveportal
mkdir -p ${FAKE_ROOT}/etc/captiveportal
cd $BUILD_HOME/Byzantium/captive_portal
cp captive_portal.py ${FAKE_ROOT}/usr/local/sbin
cp captive-portal.sh ${FAKE_ROOT}/usr/local/sbin
cp mop_up_dead_clients.py ${FAKE_ROOT}/usr/local/sbin
cp fake_dns.py ${FAKE_ROOT}/usr/local/sbin
cp etc/captiveportal/captiveportal.conf ${FAKE_ROOT}/etc/captiveportal/
cp -r srv/captiveportal/* ${FAKE_ROOT}/srv/captiveportal/
# Directory ownership sanity for ~guest.
echo "Confirming ownership of guest user's home directory."
safe_chown guest:guest 1000:1000 -R ${FAKE_ROOT}/home/guest
# Slap branding into module. This needs to be done more cleanly.
echo "Installing branding stuff."
cp -dr $BUILD_HOME/Byzantium/branding/* ${FAKE_ROOT}/
# Build the Byzantium module.
echo "Building 000-byzantium.xzm. Sit back and enjoy the ride."
dir2xzm ${FAKE_ROOT} ${OUTPUT}/000-byzantium.xzm
# "Hey, Bishop - do the thing with the knife!"