mirror of
https://codeberg.org/scip/jaildk.git
synced 2025-12-16 20:21:05 +01:00
initial commit
This commit is contained in:
217
README.md
217
README.md
@@ -1,2 +1,215 @@
|
||||
# jaildk
|
||||
FreeBSD jail development kit
|
||||
## jaildk - a FreeBSD jail development kit
|
||||
|
||||
This is the README for the FreeBSD jail utility `jaildk`. It can be
|
||||
used to build, update, manage and run jails in a versioned environment.
|
||||
|
||||
Every jail consists of layers of directories mounted on top of each
|
||||
other using nullfs mounts. Some of them can be shared among jails,
|
||||
some are versioned.
|
||||
|
||||
## Installation
|
||||
|
||||
Execute the following command:
|
||||
```
|
||||
./jaildk setup <directory>
|
||||
```
|
||||
|
||||
This will create the directory structure required for the tool install
|
||||
the tool itself, create a template jail and build a base directory.
|
||||
|
||||
## Basic usage
|
||||
|
||||
Let's say you installed *jaildk* into `/jail` and you want to create a
|
||||
new jail with the name 'myjail' and the ip address '172.16.1.1'.
|
||||
|
||||
The following steps need to be done:
|
||||
|
||||
### Configure /etc/jail.conf
|
||||
|
||||
Create the file `/etc/jail.conf` with the following innitial contents:
|
||||
```
|
||||
* {
|
||||
exec.start = "/bin/sh /etc/rc";
|
||||
exec.stop = "/bin/sh /etc/rc.shutdown";
|
||||
allow.raw_sockets = "false";
|
||||
sysvmsg = "new";
|
||||
sysvsem = "new";
|
||||
sysvshm = "new";
|
||||
host.hostname = $name;
|
||||
path = "/jail/run/$name";
|
||||
exec.prestart = "/jail/bin/jaildk install $name all start";
|
||||
exec.clean = "true";
|
||||
}
|
||||
|
||||
myjail {
|
||||
ip4.addr = "172.16.1.1";
|
||||
}
|
||||
```
|
||||
|
||||
Refer to [jail(8)](https://www.freebsd.org/cgi/man.cgi?query=jail&sektion=8) for more possible settings.
|
||||
|
||||
### Configure /etc/rc.conf
|
||||
|
||||
Next add the following lines to your `/etc/rc.conf`:
|
||||
```
|
||||
ifconfig_em0_alias0="inet 144.76.67.168/32"
|
||||
jail_enable="YES"
|
||||
```
|
||||
|
||||
You may need to replace the interface name `em0` with the one in use on your system.
|
||||
|
||||
|
||||
### Create the jail
|
||||
```
|
||||
# jaildk create myjail
|
||||
|
||||
- cpdup -x /jail/log/.template-20201106 /jail/test/log/myjail-20201106
|
||||
- cpdup -x /jail/home/.template/root-20201106 /jail/test/home/myjail/root-20201106
|
||||
- cpdup -x /jail/etc/.template/etc-20201106 /jail/test/etc/myjail/etc-20201106
|
||||
- cpdup -x /jail/etc/.template/local-etc-20201106 /jail/test/etc/myjail/local-etc-20201106
|
||||
/jail/data/.template/www doesn't exist, ignored
|
||||
/jail/data/.template/spool doesn't exist, ignored
|
||||
- cp -pRp /jail/etc/.template/mount.conf /jail/test/etc/.template/ports.conf /jail/test/etc/.template/mtree.conf /jail/test/etc/myjail/
|
||||
cp: /jail/etc/.template/ports.conf: No such file or directory
|
||||
Creating /jail/etc/.template/jail.conf
|
||||
Creating run and build dirs
|
||||
- mkdir -p /jail/run/myjail
|
||||
- mkdir -p /jail/build/myjail
|
||||
DONE.
|
||||
Consider adding the jail myjail to /etc/jail.conf!
|
||||
|
||||
To mount the build chroot of the new jail, execute:
|
||||
jaildk build myjail
|
||||
|
||||
To login into the build chroot
|
||||
jaildk blogin myjail
|
||||
|
||||
To mount the production chroot of the new jail, execute:
|
||||
jaildk install myjail
|
||||
|
||||
To login into the build chroot
|
||||
jaildk login myjail
|
||||
|
||||
To start the jail, execute:
|
||||
jaildk start myjail
|
||||
```
|
||||
|
||||
### Mount the build chroot of the jail
|
||||
|
||||
```
|
||||
# jaildk build myjail
|
||||
|
||||
Installing jail myjail
|
||||
mount - mount -t nullfs -o rw /jail/base/12.1-RELEASE-p10 /jail/build/myjail
|
||||
mount - mdmfs -o rw,nosuid,async -s 128m -p 1777 md /jail/build/myjail/tmp
|
||||
mount - mount -t devfs dev /jail/build/myjail/dev
|
||||
mount - mount -t nullfs -o rw /jail/log/myjail-20201106 /jail/build/myjail/var/log
|
||||
mount - mount -t nullfs -o rw /jail/appl/default-20201106 /jail/build/myjail/usr/local
|
||||
mount - mount -t nullfs -o rw /jail/etc/myjail/etc-20201106 /jail/build/myjail/etc
|
||||
mount - mount -t nullfs -o rw /jail/etc/myjail/local-etc-20201106 /jail/build/myjail/usr/local/etc
|
||||
mount - mount -t nullfs -o rw /jail/home/myjail/root-20201106 /jail/build/myjail/root
|
||||
```
|
||||
|
||||
### Chroot into the build dir and install software
|
||||
|
||||
```
|
||||
jaildk blogin myjail
|
||||
pkg install bash nginx curl ...
|
||||
vi /usr/local/etc/rc.conf
|
||||
vi /usr/local/etc/nginx/nginx.conf
|
||||
```
|
||||
|
||||
Since the build chroot is writable you can install packages and
|
||||
configure everything as needed.
|
||||
|
||||
### When done, install and start the jail
|
||||
|
||||
```
|
||||
# jaildk install myjail
|
||||
Installing jail myjail
|
||||
mount - mount -t nullfs -o ro /jail/base/12.1-RELEASE-p10 /jail/run/myjail
|
||||
mount - mdmfs -o rw,nosuid,async -s 128m -p 1777 md /jail/run/myjail/tmp
|
||||
mount - mount -t devfs dev /jail/run/myjail/dev
|
||||
mount - mount -t nullfs -o rw /jail/log/myjail-20201106 /jail/run/myjail/var/log
|
||||
mount - mount -t nullfs -o ro /jail/appl/default-20201106 /jail/run/myjail/usr/local
|
||||
mount - mount -t nullfs -o ro /jail/etc/myjail/etc-20201106 /jail/run/myjail/etc
|
||||
mount - mount -t nullfs -o ro /jail/etc/myjail/local-etc-20201106 /jail/run/myjail/usr/local/etc
|
||||
mount - mount -t nullfs -o rw /jail/home/myjail/root-20201106 /jail/run/myjail/root
|
||||
|
||||
# jaildk start myjail
|
||||
Jail myjail start:
|
||||
Starting jails: myjail.
|
||||
|
||||
# jaildk startus myjail
|
||||
Jail scipown status:
|
||||
JID IP Address Hostname Path
|
||||
myjail 172.16.1.1 myjail /jail/run/myjail
|
||||
Jail myjail rc status:
|
||||
syslogd is running as pid 28180.
|
||||
cron is running as pid 52130.
|
||||
php_fpm is running as pid 45558.
|
||||
nginx is running as pid 63975.
|
||||
===> fcgiwrap profile: mediawiki
|
||||
fcgiwrap is running as pid 37682.
|
||||
```
|
||||
|
||||
### Login into the running jail for administration
|
||||
```
|
||||
# jaildk jlogin myjail
|
||||
```
|
||||
|
||||
You can use this to login into a database or execute commands inside the jail.
|
||||
|
||||
|
||||
### Updating a jail
|
||||
|
||||
The very first thing to do is to update the host system using `freebsd-update`.
|
||||
|
||||
Next create a new base version:
|
||||
```
|
||||
jaildk base `uname -r`
|
||||
```
|
||||
|
||||
Now you can create clone of your jail with a new version:
|
||||
```
|
||||
jaildk clone myjail myjail 20201106 20210422
|
||||
```
|
||||
|
||||
Mount the build chroot for the new version:
|
||||
```
|
||||
jaildk build myjail start `uname -r` 20210422
|
||||
```
|
||||
|
||||
And finally chroot into the new jail and update it:
|
||||
```
|
||||
blogin myjail
|
||||
pkg update
|
||||
...
|
||||
```
|
||||
|
||||
The last step is to remove the current running jail, change the version in `etc/myjail.conf`, install and start the new version.
|
||||
|
||||
If there's anything wrong you can always go back to the previous version using the above steps.
|
||||
|
||||
|
||||
## Getting help
|
||||
|
||||
Although I'm happy to hear from jaildk users in private email,
|
||||
that's the best way for me to forget to do something.
|
||||
|
||||
In order to report a bug, unexpected behavior, feature requests
|
||||
or to submit a patch, please open an issue on github:
|
||||
https://github.com/TLINDEN/jaildk/issues.
|
||||
|
||||
## Copyright and license
|
||||
|
||||
This software is licensed under the BSD license.
|
||||
|
||||
## Authors
|
||||
|
||||
T.v.Dein <tom AT vondein DOT org>
|
||||
|
||||
## Project homepage
|
||||
|
||||
https://github.com/TLINDEN/jaildk
|
||||
|
||||
|
||||
918
jaildk
Normal file
918
jaildk
Normal file
@@ -0,0 +1,918 @@
|
||||
#!/bin/sh
|
||||
|
||||
version=1.00
|
||||
|
||||
usage_jaildk() {
|
||||
beg=`tput -T ${TERM:-cons25} md`
|
||||
end=`tput -T ${TERM:-cons25} me`
|
||||
usage=$(cat <<EOF
|
||||
This is jaildk version $version, a jail management toolkit.
|
||||
|
||||
Usage: $0 <command> <mode-args>
|
||||
|
||||
${beg}Building Jails:${end}
|
||||
base - build a new base
|
||||
build - install a build chroot of a jail
|
||||
create - create a new jail from a template
|
||||
clone - clone an existing jail or jail version
|
||||
|
||||
${beg}Installing Jails:${end}
|
||||
install - install a jail (prepare mounts, devfs etc)
|
||||
uninstall - uninstall a jail
|
||||
remove - remove a jail or a jail version
|
||||
reinstall - stop, remove, install and start a jail
|
||||
|
||||
${beg}Maintaining Jails:${end}
|
||||
start - start a jail
|
||||
stop - stop a jail
|
||||
restart - restart a jail
|
||||
status - display a jail's status
|
||||
rc - execute an rc-script inside a jail
|
||||
|
||||
${beg}Managing Jails:${end}
|
||||
login - login into a jail (also available as separate command)
|
||||
blogin - chroot into a build jail (dito)
|
||||
|
||||
Run the <command> without arguments to get usage help about the command.
|
||||
|
||||
EOF
|
||||
)
|
||||
echo "$usage"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ex() {
|
||||
echo $rcscript - $*
|
||||
$*
|
||||
}
|
||||
|
||||
err () {
|
||||
echo "$@" #>&2
|
||||
}
|
||||
|
||||
bold() {
|
||||
if [ -z "$BOLD_ON" ]; then
|
||||
BOLD_ON=`tput -T ${TERM:-cons25} md`
|
||||
export BOLD_ON
|
||||
BOLD_OFF=`tput -T ${TERM:-cons25} me`
|
||||
export BOLD_OFF
|
||||
fi
|
||||
echo -n "$BOLD_ON"
|
||||
echo "$@"
|
||||
echo -n "$BOLD_OFF"
|
||||
}
|
||||
|
||||
die() {
|
||||
bold "$*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
load-jail-config() {
|
||||
jail=$1
|
||||
if test -d $j/etc/$jail; then
|
||||
. $j/etc/$jail/jail.conf
|
||||
else
|
||||
die "Jail $jail is not configured!"
|
||||
fi
|
||||
}
|
||||
|
||||
die_if_not_exist() {
|
||||
jail=$1
|
||||
which=$2
|
||||
|
||||
if test -z "$which"; then
|
||||
which="Jail"
|
||||
fi
|
||||
if ! test -d $j/etc/$jail; then
|
||||
die "$which $jail doesn't exist!"
|
||||
fi
|
||||
}
|
||||
|
||||
jaildk_build() {
|
||||
jail=$1
|
||||
mode=$2
|
||||
base=$3
|
||||
version=$4
|
||||
|
||||
if test -z "$mode"; then
|
||||
echo "Usage: $0 build <jail name> <start|stop|status> [<base>] [<version>]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$base"; then
|
||||
# default: latest
|
||||
base=`ls $j/base | tail -1`
|
||||
fi
|
||||
|
||||
jaildk_install $jail all $mode $base $version
|
||||
}
|
||||
|
||||
jaildk_rc_mount() {
|
||||
jail=$1
|
||||
mode=$2
|
||||
rw=$3
|
||||
BASE=$4
|
||||
VERSION=$5
|
||||
rcscript=mount
|
||||
|
||||
load-jail-config $jail
|
||||
|
||||
conf=$j/etc/$jail/$rcscript.conf
|
||||
|
||||
if ! test -e "$conf"; then
|
||||
return
|
||||
fi
|
||||
|
||||
if test -n "$rw"; then
|
||||
run=$j/build
|
||||
if test -n "$BASE"; then
|
||||
base=$BASE
|
||||
fi
|
||||
if test -n "$VERSION"; then
|
||||
version=$VERSION
|
||||
fi
|
||||
else
|
||||
run=$j/run
|
||||
fi
|
||||
|
||||
die_if_not_exist $jail
|
||||
|
||||
# parse the config and (u)mount
|
||||
case $mode in
|
||||
stop)
|
||||
tail -r $conf | grep -v "#"
|
||||
;;
|
||||
*)
|
||||
grep -v "#" $conf
|
||||
;;
|
||||
esac | while read LINE; do
|
||||
# This command expands variables and performs field-splitting:
|
||||
set -- $(eval echo \""$LINE"\")
|
||||
|
||||
# Skip empty lines:
|
||||
case "$1" in
|
||||
"") continue ;;
|
||||
esac
|
||||
|
||||
src=$1
|
||||
dest=$2
|
||||
fs=$3
|
||||
opts=$4
|
||||
size=$5
|
||||
perm=$6
|
||||
|
||||
if test -n "$rw"; then
|
||||
opts=`echo "$opts" | sed 's/ro/rw/g'`
|
||||
fi
|
||||
|
||||
case $mode in
|
||||
start)
|
||||
if mount -v | grep " $run/$dest " > /dev/null ; then
|
||||
bold "$run/$dest already mounted!"
|
||||
else
|
||||
case $fs in
|
||||
mfs)
|
||||
ex mdmfs -o $opts -s $size -p $perm md $run/$dest
|
||||
;;
|
||||
nullfs)
|
||||
source=$j/$src
|
||||
if echo $src | egrep -q "^/"; then
|
||||
source=$src
|
||||
fi
|
||||
ex mount -t $fs -o $opts $source $run/$dest
|
||||
;;
|
||||
devfs)
|
||||
ex mount -t devfs dev $run/$dest
|
||||
;;
|
||||
*)
|
||||
bold "unknown filesystem type $fs!"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
if mount -v | grep " $run/$dest " > /dev/null ; then
|
||||
ex umount $run/$dest
|
||||
if mount -v | grep " $run/$dest " > /dev/null ; then
|
||||
# still mounted! forcing
|
||||
ex umount -f $run/$dest
|
||||
fi
|
||||
else
|
||||
bold "$run/$dest not mounted!"
|
||||
fi
|
||||
;;
|
||||
status)
|
||||
if mount -v | grep " $run/$dest " > /dev/null ; then
|
||||
echo "$run/$dest mounted"
|
||||
else
|
||||
bold "$run/$dest not mounted"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
bold "Usage: $0 install <jail> mount {start|stop|status|restart}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
jaildk_install_usage() {
|
||||
err "Usage: $0 install <jail> [[<rc.d-script>] <start|stop|restart|status>]"
|
||||
err "If <rc.d-script> is 'all' every script will be executed in rc-order."
|
||||
err "If <rc.d-script> is not specified, just execute all scripts with <start>."
|
||||
exit 1
|
||||
}
|
||||
|
||||
jaildk_install() {
|
||||
jail=$1
|
||||
rcd=$2
|
||||
mode=$3
|
||||
|
||||
# used by jaildk_build() only
|
||||
rw=$4
|
||||
base=$5
|
||||
version=$6
|
||||
|
||||
if test -z "$jail"; then
|
||||
jaildk_install_usage
|
||||
fi
|
||||
|
||||
if test -z "$rcd"; then
|
||||
# default just install all
|
||||
mode=start
|
||||
rcd=all
|
||||
else
|
||||
case $rcd in
|
||||
start|stop|restart|status)
|
||||
# shift args
|
||||
mode=$rcd
|
||||
rcd=all
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if test -z "$mode"; then
|
||||
jaildk_install_usage
|
||||
fi
|
||||
|
||||
die_if_not_exist $jail
|
||||
|
||||
if test "$rcd" = "all"; then
|
||||
rcscripts="jaildk_rc_mount"
|
||||
else
|
||||
rcscripts="jaildk_rc_${rcd}"
|
||||
if ! type "$rcscripts" > /dev/null 2>&1; then
|
||||
die "rc function $rcd doesn't exist!"
|
||||
fi
|
||||
fi
|
||||
|
||||
case $mode in
|
||||
start)
|
||||
bold "Installing jail $jail"
|
||||
;;
|
||||
stop)
|
||||
bold "Unstalling jail $jail"
|
||||
;;
|
||||
esac
|
||||
|
||||
for rcscript in $rcscripts; do
|
||||
$rcscript $jail $mode $rw $base $version
|
||||
done
|
||||
}
|
||||
|
||||
jaildk_uninstall() {
|
||||
# wrapper around _install
|
||||
jail=$1
|
||||
rw=$2
|
||||
|
||||
if test -z "$jail"; then
|
||||
err "Usage: $0 uninstall <jail> [<remove build>]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
die_if_not_exist $jail
|
||||
|
||||
if jls | egrep -q "${jail}"; then
|
||||
die "Jail $jail($version) is still running, stop it before removing!"
|
||||
fi
|
||||
|
||||
jaildk_install $jail all stop $rw
|
||||
}
|
||||
|
||||
jaildk_base() {
|
||||
base=$1
|
||||
|
||||
if echo "$base" | egrep -q "^/"; then
|
||||
basedir=$j/base/$base
|
||||
else
|
||||
basedir=$base
|
||||
fi
|
||||
|
||||
removelist="tests
|
||||
usr/bin/objdump
|
||||
usr/bin/llvm-profdata
|
||||
usr/bin/ranlib
|
||||
usr/bin/ar
|
||||
usr/bin/as
|
||||
usr/bin/llvm-tblgen
|
||||
usr/bin/llvm-symbolizer
|
||||
usr/bin/llvm-cov
|
||||
usr/bin/llvm-objdump
|
||||
usr/bin/ld.lld
|
||||
usr/bin/lldb
|
||||
usr/bin/cpp
|
||||
usr/bin/clang-cpp
|
||||
usr/bin/clang++
|
||||
usr/bin/clang
|
||||
usr/bin/cc
|
||||
usr/bin/c++
|
||||
usr/bin/lex
|
||||
usr/bin/lex++
|
||||
usr/bin/flex
|
||||
usr/bin/flex++
|
||||
usr/bin/telnet
|
||||
usr/bin/kadmin
|
||||
usr/bin/kcc
|
||||
usr/bin/kdestroy
|
||||
usr/bin/kdump
|
||||
usr/bin/keylogin
|
||||
usr/bin/keylogout
|
||||
usr/bin/kf
|
||||
usr/bin/kgetcred
|
||||
usr/bin/kinit
|
||||
usr/bin/klist
|
||||
usr/bin/kpasswd
|
||||
usr/bin/krb5-config
|
||||
usr/bin/ksu
|
||||
usr/bin/kswitch
|
||||
usr/bin/ktrace
|
||||
usr/bin/ktrdump
|
||||
usr/bin/finger
|
||||
usr/bin/crunch*
|
||||
usr/bin/ibv*
|
||||
usr/bin/nc
|
||||
usr/bin/pftp
|
||||
usr/bin/ssh*
|
||||
usr/bin/scp
|
||||
usr/bin/sftp
|
||||
usr/bin/svn*
|
||||
usr/bin/yacc
|
||||
usr/include
|
||||
usr/lib/*.a
|
||||
usr/lib32/*.a
|
||||
usr/share/doc
|
||||
usr/share/dict
|
||||
usr/share/examples
|
||||
usr/share/man
|
||||
rescue
|
||||
media
|
||||
mnt
|
||||
boot"
|
||||
if test -z "$basedir"; then
|
||||
die "Usage: $0 base <base dir>"
|
||||
fi
|
||||
|
||||
if test -d "$basedir"; then
|
||||
echo "base $basedir already exist!"
|
||||
exit 1
|
||||
else
|
||||
ex mkdir -p $basedir
|
||||
DISTRIBUTIONS="base.txz" bsdinstall jail $basedir
|
||||
for file in $removelist; do
|
||||
ex rm -rf $basedir/$file
|
||||
done
|
||||
|
||||
ex rm -rf $basedir/var/db
|
||||
ex ln -s /usr/local/db $basedir/var/db
|
||||
fi
|
||||
}
|
||||
|
||||
clone() {
|
||||
srcdir=$1
|
||||
dstdir=$2
|
||||
|
||||
if test -d $srcdir; then
|
||||
if ! test -d $dstdir; then
|
||||
mkdir -p $dstdir
|
||||
fi
|
||||
|
||||
ex cpdup -x $srcdir $dstdir
|
||||
else
|
||||
echo "$srcdir doesn't exist, ignored"
|
||||
fi
|
||||
}
|
||||
|
||||
jaildk_clone() {
|
||||
src=$1
|
||||
new=$2
|
||||
srcversion=$3
|
||||
newversion=$4
|
||||
update=""
|
||||
|
||||
if test -z "$new"; then
|
||||
echo "Usage: $0 clone <source jail> <new jail> [<source version> [<new version>]]"
|
||||
echo "Hints:"
|
||||
echo "- if no source version has been given, tha latest version will be used."
|
||||
echo "- if no new version has been given, source version will be used."
|
||||
echo "- if source and new jail are the same, both versions must be given"
|
||||
echo " and a new version of the same jail will be created (update)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "$src" = "$new"; then
|
||||
# same jail, expect different versions
|
||||
if test -z "$newversion" -o -z "$srcversion"; then
|
||||
die "source and new version required!"
|
||||
fi
|
||||
|
||||
if test "$srcversion" = "$newversion"; then
|
||||
die "new version must be different from source version!"
|
||||
fi
|
||||
update=1
|
||||
else
|
||||
# clone from A to B
|
||||
die_if_not_exist $src "Source jail"
|
||||
die_if_not_exist $new "Destionation jail"
|
||||
|
||||
if test -z "$srcversion"; then
|
||||
. $j/etc/$src/jail.conf
|
||||
srcversion=$version
|
||||
newversion=$version
|
||||
else
|
||||
if ! test -d $j/etc/$src/etc-$srcversion; then
|
||||
die "Version $srcversion of source jail $src doesn't exist!"
|
||||
else
|
||||
if test -z "$newversion"; then
|
||||
newversion=$srcversion
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
clone $j/log/$src-$srcversion $j/log/$new-$newversion
|
||||
clone $j/home/$src/root-$srcversion $j/home/$new/root-$newversion
|
||||
clone $j/etc/$src/etc-$srcversion $j/etc/$new/etc-$newversion
|
||||
clone $j/etc/$src/local-etc-$srcversion $j/etc/$new/local-etc-$newversion
|
||||
|
||||
if test -z "$update"; then
|
||||
clone $j/data/$src/www $j/data/$new/www
|
||||
clone $j/data/$src/spool $j/data/$new/spool
|
||||
|
||||
ex cp -pRp $j/etc/$src/mount.conf $j/etc/$src/ports.conf $j/etc/$src/mtree.conf $j/etc/$new/
|
||||
|
||||
echo "Creating $j/etc/$src/jail.conf"
|
||||
cat $j/etc/$src/jail.conf | egrep -v "^(name|version)=" > $j/etc/$new/jail.conf
|
||||
(echo "name=$new"; echo "version=$newversion") >> $j/etc/$new/jail.conf
|
||||
|
||||
echo "Creating run and build dirs"
|
||||
ex mkdir -p $j/run/$new
|
||||
ex mkdir -p $j/build/$new
|
||||
fi
|
||||
|
||||
echo "DONE."
|
||||
|
||||
if test -z "$update"; then
|
||||
if ! egrep -q "^$new" /etc/jail.conf; then
|
||||
bold "Consider adding the jail $new to /etc/jail.conf!"
|
||||
echo
|
||||
fi
|
||||
|
||||
bold "To mount the build chroot of the new jail, execute:"
|
||||
echo "jaildk build $new start"
|
||||
echo
|
||||
bold "To login into the build chroot"
|
||||
echo "jaildk blogin $new"
|
||||
echo
|
||||
bold "To mount the production chroot of the new jail, execute:"
|
||||
echo "jaildk install $new"
|
||||
echo
|
||||
bold "To login into the build chroot"
|
||||
echo "jaildk login $new"
|
||||
echo
|
||||
bold "To start the jail, execute:"
|
||||
echo "jaildk start $new"
|
||||
echo
|
||||
else
|
||||
. $j/etc/$src/jail.conf
|
||||
bold "To mount the build chroot of the new jail, execute:"
|
||||
echo "jaildk build $new start $base $newversion"
|
||||
fi
|
||||
}
|
||||
|
||||
jaildk_create() {
|
||||
jail=$1
|
||||
src=.template
|
||||
|
||||
if test -z "$jail"; then
|
||||
die "Usage: $0 create <jail>"
|
||||
fi
|
||||
|
||||
. $j/etc/$src/jail.conf
|
||||
srcversion=$version
|
||||
newversion=`date +%Y%m%d`
|
||||
|
||||
mkdir -p $j/etc/$jail
|
||||
|
||||
jaildk_clone $src $jail $srcversion $newversion
|
||||
}
|
||||
|
||||
remove() {
|
||||
dir=$1
|
||||
|
||||
if test -d $dir; then
|
||||
ex rm -rf $dir
|
||||
else
|
||||
echo "$dir doesn't exist anymore"
|
||||
fi
|
||||
}
|
||||
|
||||
jaildk_remove() {
|
||||
jail=$1
|
||||
version=$2
|
||||
|
||||
if test -z "$jail"; then
|
||||
die "Usage: $0 remove <jail> [<version>]"
|
||||
fi
|
||||
|
||||
if jls | egrep -q "${jail}"; then
|
||||
die "Jail $jail($version) is still running, stop it before removing!"
|
||||
fi
|
||||
|
||||
if mount | egrep -q "${jail}.*${version}"; then
|
||||
die "Jail $jail($version) is still mounted, umount it before removing!"
|
||||
fi
|
||||
|
||||
die_if_not_exist $jail
|
||||
|
||||
if test -n "$version"; then
|
||||
if ! test -d $j/etc/$jail/etc-$version; then
|
||||
die "Jail $jail $version doesn't exist!"
|
||||
fi
|
||||
|
||||
remove $j/etc/$jail/etc-$version
|
||||
remove $j/etc/$jail/local-etc-$version
|
||||
remove $j/home/$jail/root-$version
|
||||
remove $j/log/$jail-$version
|
||||
remove $j/data/$jail/www
|
||||
remove $j/data/$jail/spool
|
||||
else
|
||||
remove $j/etc/$jail
|
||||
remove $j/home/$jail
|
||||
remove $j/log/$jail-*
|
||||
remove $j/data/$jail
|
||||
fi
|
||||
}
|
||||
|
||||
jaildk_jail_usage() {
|
||||
die "Usage: $0 <start|stop|restart|status> <jail> | status"
|
||||
}
|
||||
|
||||
|
||||
jaildk_jail() {
|
||||
mode=$1
|
||||
jail=$2
|
||||
|
||||
if test -z "$mode"; then
|
||||
jaildk_jail_usage
|
||||
fi
|
||||
|
||||
if test -z "$jail" -a $mode = "status"; then
|
||||
bold "Running jails:"
|
||||
bold " JID IP Address Hostname Path"
|
||||
jls | grep -v JID
|
||||
|
||||
bold "Mounted build jails:"
|
||||
format=" %-15s %-29s %s\n"
|
||||
|
||||
bold " Version Hostname Path"
|
||||
mount | egrep "local-etc.*build" | awk '{print $1}' | sed -e 's|/| |g' -e 's/local-etc-//' | while read j e jail version; do
|
||||
printf "$format" $version $jail $j/build/$jail
|
||||
done
|
||||
|
||||
jls | grep -v JID | awk '{print $3}' | while read J; do
|
||||
jaildk_rc $J status
|
||||
done
|
||||
elif test -z "$jail"; then
|
||||
jaildk_jail_usage
|
||||
else
|
||||
bold "Jail $jail $mode:"
|
||||
case $mode in
|
||||
status)
|
||||
service jail $mode $jail | egrep "IP|$jail"
|
||||
jaildk_rc $jail status
|
||||
;;
|
||||
*)
|
||||
service jail $mode $jail
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
get_rc_cripts() {
|
||||
jail=$1
|
||||
|
||||
rcorder $j/run/$jail/usr/local/etc/rc.d/* $j/run/$jail/etc/rc.d/* |
|
||||
while read SCRIPT; do
|
||||
rcvar=`egrep "^rcvar=" $SCRIPT | cut -d= -f2 | sed 's/"//g' | tail -1`
|
||||
if egrep -iq "^${rcvar}=.*yes" $j/run/$jail/usr/local/etc/rc.conf; then
|
||||
echo $SCRIPT | sed "s|$j/run/$jail||"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
jaildk_rc_usage() {
|
||||
err "Usage: $0 rc <jail> {<rc-script> [<mode>] | <mode>}"
|
||||
err "If <rc-script> is all, execute <mode> for every rc script"
|
||||
err "<mode> must be a parameter of <rc-script>"
|
||||
err "if only <mode> has been given, execute all scripts"
|
||||
exit 1
|
||||
}
|
||||
|
||||
jaildk_rc() {
|
||||
jail=$1
|
||||
rc=$2
|
||||
mode=$3
|
||||
|
||||
if test -z "$rc"; then
|
||||
jaildk_rc_usage
|
||||
fi
|
||||
|
||||
if test -z "$mode"; then
|
||||
# shift args
|
||||
case $rc in
|
||||
start|stop|restart|status)
|
||||
# shift args
|
||||
mode=$rc
|
||||
rc=all
|
||||
;;
|
||||
*)
|
||||
jaildk_rc_usage
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if ! jls | egrep -q "${jail}"; then
|
||||
die "Jail $jail is not running."
|
||||
fi
|
||||
|
||||
rcs=`get_rc_cripts $jail`
|
||||
|
||||
if test $rc = "all"; then
|
||||
bold "Jail $jail rc status:"
|
||||
for script in $rcs; do
|
||||
jexec $jail $script $mode
|
||||
done
|
||||
else
|
||||
ok=''
|
||||
for script in $rcs; do
|
||||
if echo "$script" | egrep -q "/$rc"; then
|
||||
jexec $jail $script $mode
|
||||
ok=1
|
||||
fi
|
||||
done
|
||||
|
||||
if test -z "$ok"; then
|
||||
die "Script $rc doesn't exist in $jail or is not enabled."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
jaildk_blogin() {
|
||||
jail=$1
|
||||
|
||||
if test -z "$jail"; then
|
||||
file=`basename $0`
|
||||
if test "$file" = "jaildk"; then
|
||||
file="$0 blogin"
|
||||
else
|
||||
file="$0"
|
||||
fi
|
||||
echo "Usage: $file <jail-name|jail-domain|jail-ip> [<user>]"
|
||||
echo "mounted build jails:"
|
||||
mount|egrep "base.*build" | awk '{print $3}' | cut -d/ -f 4
|
||||
exit
|
||||
fi
|
||||
|
||||
chroot="$j/build/$jail"
|
||||
|
||||
if ! test -d $chroot/root; then
|
||||
echo "build jail $jail not mounted!"
|
||||
echo "Mount it with jaildk build $jail start"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
shell=/bin/csh
|
||||
term=vt100
|
||||
home=/root
|
||||
path=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
|
||||
|
||||
if test -e $chroot/root/.bashrc; then
|
||||
shell=/usr/local/bin/bash
|
||||
fi
|
||||
|
||||
chroot $chroot /etc/rc.d/ldconfig onestart > /dev/null 2>&1
|
||||
env - JAIL=$jail HOME=$home TERM=$term SHELL=$shell PATH=$path chroot $chroot $shell
|
||||
}
|
||||
|
||||
jaildk_login() {
|
||||
jail=$1
|
||||
user=$2
|
||||
me=`id -u`
|
||||
jexec="jexec"
|
||||
|
||||
if test -z "$jail"; then
|
||||
file=`basename $0`
|
||||
if test "$file" = "jaildk"; then
|
||||
file="$0 jlogin"
|
||||
else
|
||||
file="$0"
|
||||
fi
|
||||
echo "Usage: $file <jail-name|jail-domain|jail-ip> [<user>]"
|
||||
echo "available jails:"
|
||||
jls
|
||||
exit
|
||||
fi
|
||||
|
||||
jid=""
|
||||
|
||||
jid=`jls | grep " $jail" | awk '{print $1}'`
|
||||
|
||||
if test -z "$jid"; then
|
||||
echo "jail $jail doesn't run!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
shell=sh
|
||||
home=/home/$user
|
||||
term=vt100
|
||||
path=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
|
||||
chroot_subdir=`grep "jail_${name}_rootdir" /etc/rc.conf | awk -F\" '{print $2}'`
|
||||
|
||||
if test -z "$user"; then
|
||||
user=root
|
||||
fi
|
||||
|
||||
if test "$me" != "0"; then
|
||||
jexec="sudo $jexec"
|
||||
fi
|
||||
|
||||
shell=/bin/sh
|
||||
home=/
|
||||
|
||||
if grep "^$user" $chroot_subdir/etc/passwd > /dev/null 2>&1; then
|
||||
shell=`grep "^$user" $chroot_subdir/etc/passwd | awk -F: '{print $7}' | sed 's/ //g'`
|
||||
home=`grep "^$user" $chroot_subdir/etc/passwd | awk -F: '{print $6}' | sed 's/ //g'`
|
||||
fi
|
||||
|
||||
env - JAIL=$jail HOME=$home TERM=$term SHELL=$shell PATH=$path $jexec -U $user $jid $shell
|
||||
}
|
||||
|
||||
|
||||
jaildk_reinstall() {
|
||||
jail=$1
|
||||
|
||||
die_if_not_exist $jail
|
||||
|
||||
if jls | egrep -q "${jail}"; then
|
||||
jaildk_jail stop $jail
|
||||
fi
|
||||
|
||||
jaildk_uninstall $jail
|
||||
|
||||
sleep 0.2
|
||||
sync
|
||||
|
||||
jaildk_install $jail start
|
||||
jaildk_jail start $jail
|
||||
|
||||
sleep 0.2
|
||||
|
||||
jaildk_jail status $jail
|
||||
}
|
||||
|
||||
|
||||
jaildk_setup() {
|
||||
j=$1
|
||||
|
||||
if test -z "$j"; then
|
||||
die "Usage: $0 setup <base dir for jail environment>"
|
||||
fi
|
||||
|
||||
bold "preparing directories"
|
||||
ex mkdir -p $j
|
||||
for subdir in etc bin appl base data home log run; do
|
||||
ex mkdir -p $j/$subdir
|
||||
done
|
||||
|
||||
version=`date +%Y%m%d`
|
||||
|
||||
for subdir in appl/default-$version/db appl/default-$version/etc etc/.template/etc etc/.template/local-etc-$version home/.template/root-$version log/.template-$version; do
|
||||
ex mkdir -p $j/$subdir
|
||||
done
|
||||
|
||||
bold "building jail template"
|
||||
ex cpdup /etc $j/etc/.template-$version
|
||||
echo "creating $j/etc/.template/etc-$version/rc.conf"
|
||||
echo 'rc_conf_files="/etc/rc.conf /etc/rc.conf.local /usr/local/etc/rc.conf"' > $j/etc/.template/etc-$version/rc.conf
|
||||
|
||||
echo "creating $j/etc/.template/local-etc-$version/rc.conf"
|
||||
echo 'hostname="TEMPLATE"
|
||||
sendmail_enable="NO"
|
||||
sendmail_submit_enable="NO"
|
||||
sendmail_outbound_enable="NO"
|
||||
sendmail_msp_queue_enable="NO"' > $j/etc/.template/local-etc-$version/rc.conf
|
||||
|
||||
bold "creating template config $j/etc/.template/jail.conf"
|
||||
os=`uname -r`
|
||||
(echo "base=$os"; echo "version=$version"; name=template) > $j/etc/.template/jail.conf
|
||||
|
||||
bold "creating template config $j/etc/.template/mount.conf"
|
||||
echo 'base/$base $name nullfs ro
|
||||
md $name/tmp mfs rw,nosuid,async 128m 1777
|
||||
dev $name/dev devfs
|
||||
log/$name-$version $name/var/log nullfs rw
|
||||
appl/default-$version $name/usr/local nullfs ro
|
||||
etc/$name/etc-$version $name/etc nullfs ro
|
||||
etc/$name/local-etc-$version $name/usr/local/etc nullfs ro
|
||||
home/$name/root-$version $name/root nullfs rw' > $j/etc/.template/mount.conf
|
||||
|
||||
bold "creating template config $j/etc/.template/ports.conf"
|
||||
(echo bash; echo ca_root_nss) > $j/etc/.template/ports.conf
|
||||
|
||||
bold "creating template config $j/etc/.template/mtree.conf"
|
||||
touch $j/etc/.template/mtree.conf
|
||||
|
||||
bold "installing jaildk"
|
||||
realj=`cd $j; pwd`
|
||||
sed "s|^JAILDIR=.*|JAILDIR=$realj|" $0 > $j/bin/jaildk
|
||||
ex chmod 755 $j/bin/jaildk
|
||||
|
||||
bold "configuring root shell template"
|
||||
echo "# root shell inside jail
|
||||
alias h history 25
|
||||
alias j jobs -l
|
||||
alias la ls -a
|
||||
alias lf ls -FA
|
||||
alias ll ls -lA
|
||||
alias l ls -laF
|
||||
alias .. cd ..
|
||||
alias ... cd ../..
|
||||
alias .... cd ../../../
|
||||
umask 22
|
||||
set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin)
|
||||
setenv EDITOR vi
|
||||
setenv PAGER less
|
||||
setenv BLOCKSIZE K
|
||||
if (\$?prompt) then
|
||||
set chroot=`ps axu|grep /sbin/init | grep -v grep`
|
||||
if("\$chroot" == "") then
|
||||
set prompt = "(jail) %N@%m:%~ %# "
|
||||
else
|
||||
set prompt = "(build chroot) %N@%m:%~ %# "
|
||||
endif
|
||||
set promptchars = \"%#\"
|
||||
set filec
|
||||
set history = 1000
|
||||
set savehist = (1000 merge)
|
||||
set autolist = ambiguous
|
||||
# Use history to aid expansion
|
||||
set autoexpand
|
||||
set autorehash
|
||||
endif
|
||||
" > $j/home/.template/root-$version/.cshrc
|
||||
|
||||
bold "building base"
|
||||
echo -n "Do you want to build a base directory [Yn]? "
|
||||
read yesno
|
||||
case $yesno in
|
||||
y|Y|yes|YES)
|
||||
jaildk_base $j/base/$os
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
##########################
|
||||
#
|
||||
# main()
|
||||
|
||||
# will be modified during installation
|
||||
JAILDIR=/jail
|
||||
|
||||
# globals
|
||||
j=$JAILDIR
|
||||
rcdir=$j/bin
|
||||
|
||||
runner=$1
|
||||
shift
|
||||
|
||||
case $runner in
|
||||
start|stop|status|restart)
|
||||
jaildk_jail $runner $*
|
||||
;;
|
||||
setup|reinstall|install|uninstall|build|blogin|login|clone|create|remove|rc|base)
|
||||
jaildk_$runner $*
|
||||
;;
|
||||
*)
|
||||
usage_jaildk $*
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user