summaryrefslogtreecommitdiff
path: root/src/chroot-tools/librechroot
blob: d53448a16465c69c1bb1d2858944e9a16c50944b (plain)
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
#!/bin/bash
# LibreChRoot
# Enters a chroot

# Copyright 2010 Nicolás Reynolds
# Copyright 2011 Joshua Haase
# Copyright 2012 Luke Shumaker

# ---------- GNU General Public License 3 ----------

# This file is part of Parabola.

# Parabola 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
# (at your option) any later version.

# Parabola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with Parabola. If not, see <http://www.gnu.org/licenses/>.

. /etc/libretools.conf

cmd=${0##*/}

clean_chroot() {  # Clean packages with pacman
	msg "Cleaning chroot with pacman: ${chroot_path}"

	cp -a "$(dirname $0)/chcleanup"   "${chroot_path}/clean"
	mkarchroot -r "cd /build; /clean" "${chroot_path}"

	#mkarchroot "${chroot_path}" base base-devel sudo "${CHROOTEXTRAPKG[@]}"
}

clean_repo() {
	msg "Cleaning repo for chroot: ${chroot_path}"

	if [ -d  "${chroot_path}/repo" ]; then
		find "${chroot_path}/repo/" -mindepth 1 -delete
	else
		mkdir -p "${chroot_path}/repo"
	fi
	bsdtar -czf "${chroot_path}/repo/repo.db.tar.gz" -T /dev/null
	ln -s "repo.db.tar.gz" "${chroot_path}/repo/repo.db"
}

update() {
	msg "Updating chroot: ${chroot_path}"
	mkarchroot -u "${chroot_path}"
}

enter() {
	msg "Entering chroot: ${chroot_path}"
	mkarchroot -r "bash" "${chroot_path}"
}

usage() {
	echo "Usage: $cmd [OPTIONS] [CHROOT]"
	echo 'Interacts with a chroot.'
	echo ''
	echo "The default CHROOT is \`${CHROOT}'."
	echo ''
	echo 'Options:'
	echo ' Settings:'
	echo " -d <CHROOTDIR>  Use this dir instead of \`${CHROOTDIR}'"
	echo ' -l <copy>       Use this as the chroot copy instead of basing it'
	echo '                 on the username'
	echo ' Modes:'
	echo ' -h              Show this message'
	echo ' -c              Clean the chroot using pacman'
	echo ' -r              Clean /repo in the chroot'
	echo ' -u              Update the chroot'
}

main() {
	# The logic for setting CHROOTCOPY is mirred from makechrootpkg
	CHROOTCOPY=$USER
	[[ -n $SUDO_USER ]] && CHROOTCOPY=$SUDO_USER
	[[ -z $CHROOTCOPY || $CHROOTCOPY = root ]] && CHROOTCOPY=copy

	local mode=enter
	while getopts 'hrcud:l:' arg; do
		case $arg in
			d) CHROOTDIR=$OPTARG;;
			l) CHROOTCOPY=$OPTARG;;

			c) mode=clean_chroot;;
			r) mode=clean_repo;;
			u) mode=update;;

			h) usage; exit 0;;
			*) usage; exit 1;;
		esac
	done
	shift $(($OPTIND - 1))
	case $# in
		0) :;;
		1) CHROOT="$1";;
		*) usage; exit 1;;
	esac

	# not local
	chroot_path="${CHROOTDIR}/${CHROOT}/${CHROOTCOPY}"

	if (( EUID )); then
		error "This script must be run as root."
		exit 1
	fi

	case "$mode" in
		clean_chroot) clean_chroot; exit $?;;
		clean_repo) clean_repo; exit $?;;
		update) update; exit $?;;
		enter) enter; exit $?;;
	esac
}

main "$@"