Getting started with ACF development
For the impatient, download http://dev.alpinelinux.org/~ncopa/setup-acf-dev and execute as root.
The script will:
- Set up a small alpine chroot environment
- Set up a user in the environment with sudo access
- Install needed applications like subversion, http server and vim
- Configure the http server
- Check out ACF modules from svn repository and install them in the environemt
- Create a simple .vimrc with useful key binding
- Create a simple script to enter the chroot
#!/bin/sh
# bootstrap an alpine installation and set up ACF development
# version 1.2
usage() {
cat << EOF
usage: $(basename $0) TARGETDIR
The following environment variables are used:"
WGET path to wget program ($WGET)
TAR path to tar program ($TAR)
MIRROR alpine mirror ($MIRROR)
BASE name of alpine base package ($BASE)
ACFUSER non-root username to use in chroot (\$SUDO_USER)
ACFSVN svn repository base ($ACFSVN)
MODULES svn modules to checkout ($MODULES)
CHROOT chroot program. I.E 'linux32 chroot' ($CHROOT)
PORT port for mini_httpd ($PORT)
http_proxy proxy server ($http_proxy)
EOF
exit 3
}
die () {
echo "$@" >&2
exit 3
}
# read args
# set up vars
: ${WGET:="/usr/bin/wget"}
: ${TAR:="/usr/bin/tar"}
: ${MIRROR:="http://dev.alpinelinux.org/alpine/v1.7"}
: ${ACFSVN:="svn://svn.alpinelinux.org/acf"}
: ${MODULES:="core alpine-baselayout"}
: ${BASE:="base.tar.bz2"}
: ${ACFUSER:="$SUDO_USER"}
: ${CHROOT:="chroot"}
: ${PORT:="80"}
target=$1
CHD="$CHROOT $target"
[ -n "$http_proxy" ] && PROXY="http_proxy=$http_proxy"
APPS="haserl make mini_httpd subversion sudo vim luafilesystem"
# main
[ -z "$target" ] && usage
[ "$target" = "/" ] && die "Bootstrapping Alpine to '/' is probably not a good idea. Aborting..."
[ `whoami` != root ] && die "This script needs to be run as root."
while ! getent passwd "$ACFUSER" >/dev/null 2>&1 && [ "$ACFUSER" != root ] ; do
echo -n "Enter non-root username: "
read ACFUSER
done
mkdir -p "$target"
echo ">>> Fetching $MIRROR/$BASE..."
sh -c "$PROXY $WGET -q -O - $MIRROR/$BASE | tar -C \"$target\" -jxv" \
|| die "Failed to fetch or unpack $BASE"
echo ">>> Creating missing dirs..."
for dir in proc sys dev home; do
mkdir -p "$target/$dir"
done
echo ">>> Installing busybox links..."
# create fake /proc/self/exe
mkdir -p "$target/proc/self"
ln -s /bin/busybox "$target/proc/self/exe"
$CHD /bin/busybox --install -s
rm -r "$target/proc/self"
if [ -f /etc/resolv.conf ]; then
echo ">>> Copying /etc/resolv.conf..."
cp /etc/resolv.conf "$target/etc/"
fi
echo ">>> Setting up APK_PATH..."
mkdir -p "$target/etc/apk"
echo "APK_PATH=$MIRROR/apks" >> "$target/etc/apk/apk.conf"
if [ -n "$http_proxy" ]; then
echo ">>> Setting up http_proxy..."
sed -i -e '/^http_proxy=/d' "$target/etc/profile"
echo "http_proxy=$http_proxy" >> "$target/etc/profile"
fi
echo ">>> Settig up user $ACFUSER..."
$CHD adduser -D $ACFUSER
echo ">>> Installing applications..."
$CHD /bin/sh -c "$PROXY apk_add $APPS"
echo ">>> Setting up $ACFUSER as passwordless sudo user..."
sed -i -e "/^$ACFUSER /d" "$target/etc/sudoers"
echo "$ACFUSER ALL=(ALL) NOPASSWD: ALL" >> "$target/etc/sudoers"
echo ">>> Setting up mini_httpd..."
sed -i -e "/^MINI_HTTPD.*/d" "$target/etc/conf.d/mini_httpd"
echo 'MINI_HTTPD_OPTS="-C /etc/mini_httpd.conf"
MINI_HTTPD_DOCROOT=/var/www/localhost/htdocs' \
>> "$target/etc/conf.d/mini_httpd"
cat << EOF > "$target/etc/mini_httpd.conf"
nochroot
dir=/var/www/localhost/htdocs
user=nobody
logfile=/var/log/mini_httpd.log
cgipat=cgi-bin**
port=$PORT
EOF
$CHD mkdir -p /var/www/localhost
$CHD ln -sf /usr/share/acf/www /var/www/localhost/htdocs
for svnmod in $MODULES ; do
echo ">>> Checking out ACF module $svnmod"
$CHD su $ACFUSER -c "svn co $ACFSVN/$svnmod/trunk ~/$svnmod"
echo ">>> Installing ACF module $svnmod"
$CHD su $ACFUSER -c "cd ~/$svnmod && sudo make install"
done
echo ">>> Creating .vimrc..."
cat <<EOF > "$target/home/$ACFUSER/.vimrc"
noremap <F9> <C-C>:w<CR> :! sudo make install<CR>
inoremap <F9> <C-C>:w<CR> :! sudo make install<CR>
EOF
echo ">>> Creating enter-chroot script..."
cat <<EOF > "$target/enter-chroot"
dir=\$(dirname \$0)
mount --bind /proc \$dir/proc
echo "Entering ACF develmopment chroot. Type 'exit' or press ctrl-d to leave."
$CHROOT \$(dirname \$0) /bin/sh -c 'su -l $ACFUSER'
echo "Left ACF development chroot."
umount \$dir/proc
EOF
chmod +x "$target/enter-chroot"
cat <<EOF
>>>
>>> Setup Completed. Enter the chroot environement with (as root):
>>>
>>> $target/enter-chroot
>>>
>>> Once inside the chroot the privileges will drop to '$ACFUSER'.
>>> You can start and stop mini_httpd within chroot by executing:
>>>
>>> sudo /etc/init.d/mini_httpd start
>>> sudo /etc/init.d/mini_httpd stop
>>>
>>> You can specify the port in /etc/mini_httpd.conf
>>>
>>> Remember to install the acf module to activate changes:
>>>
>>> sudo make install
>>>
EOF