Welcome to mirror list, hosted at ThFree Co, Russian Federation.

jail.sh.dragonfly « poudriere « share « src - github.com/freebsd/poudriere.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5e04a5b8395f2ad649d54e2ed422cba18cbd3309 (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
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
#!/bin/sh
# DRAGONFLY SPECIFIC DEFINITIONS

delete_jail() {
	local cache_dir method

	test -z ${JAILNAME} && usage JAILNAME
	jail_exists ${JAILNAME} || err 1 "No such jail: ${JAILNAME}"
	jail_runs ${JAILNAME} &&
		err 1 "Unable to delete jail ${JAILNAME}: it is running"
	msg_n "Removing ${JAILNAME} jail..."

	TMPFS_ALL=0 destroyfs ${JAILMNT} jail
	cache_dir="${POUDRIERE_DATA}/cache/${JAILNAME}-*"
	rm -rf ${POUDRIERED}/jails/${JAILNAME} ${cache_dir} || :
	echo " done"
}

update_version() {
	local release="$1"
	local login_env osversion

	osversion=`awk '/\#define __DragonFly_version/ { print $3 }' ${JAILMNT}/usr/include/sys/param.h`
	login_env=",UNAME_r=${release% *},UNAME_v=DragonFly ${release},OSVERSION=${osversion}"

	sed -i "" -e "s/,UNAME_r.*:/:/ ; s/:\(setenv.*\):/:\1${login_env}:/" ${JAILMNT}/etc/login.conf
	cap_mkdb ${JAILMNT}/etc/login.conf
}

update_jail() {
	METHOD=$(jget ${JAILNAME} method)
	if [ -z "${METHOD}" -o "${METHOD}" = "-" ]; then
		METHOD="git"
		jset ${JAILNAME} method ${METHOD}
	fi
	msg "Upgrading using ${METHOD}"
	case ${METHOD} in
	git)
		install_from_git ${1}
		;;
	*)
		err 1 "Unsupported method"
		;;
	esac

}

build_and_install_world() {
	[ $# -ne 1 ] && eargs quick
	local JLOGBASE=${POUDRIERE_DATA}/jailbuild/${JAILNAME}
	local factor=${PARALLEL_JOBS}
	local options="-DNO_GAMES -DNOPROFILE -DNO_ALTBINUTILS -DNO_ALTCOMPILER"
	local directive
	mkdir -p ${JLOGBASE}

	export TARGET_ARCH=${ARCH}
	export __MAKE_CONF=/dev/null
	export DESTDIR=${JAILMNT}

	if [ ${1} -eq 1 ]; then
	   directive=quickworld
	else
	   directive=buildworld
	fi
	msg "${JAILNAME}: making ${directive} with ${factor} jobs"
	make -C ${JAILMNT}/usr/src -j${factor} ${options} ${directive} > \
	  ${JLOGBASE}/build.log 2>&1 || err 1 "Fail to ${directive}"

	msg "${JAILNAME}: making installworld"
	make -C ${JAILMNT}/usr/src ${options} installworld > \
	  ${JLOGBASE}/install.log 2>&1 || err 1 "Fail to install world"

	msg "${JAILNAME}: making distribution"
	make -C ${JAILMNT}/usr/src/etc distribution > \
	  ${JLOGBASE}/distrib.log 2>&1 || err 1 "Fail to make distribution"

	# make upgrade required to link device drives (e.g. </dev/video/...)
	msg "${JAILNAME}: making world upgrade"
	make -C ${JAILMNT}/usr/src upgrade > \
	  ${JLOGBASE}/upgrade.log 2>&1 || err 1 "Fail to make world upgrade"

	# make sure world can be dismounted
	cd /
}

convert_property_version () {
	local GREPPAT='^[0-9]\.[0-9]+$'
	local FILTER=`echo "${1}" | grep -E "${GREPPAT}"`
	if [ -n "${FILTER}" ]; then
	   echo RELEASE-${1}
	else
	   echo master
	fi
}

convert_version () {
	# $1 can be empty; "master" will be returned
	local GREPPAT='^[0-9]\.[0-9]+$'
	local FILTER=`echo "${1}" | grep -E "${GREPPAT}"`
	if [ -n "${FILTER}" ]; then
	   echo DragonFly_RELEASE_`echo ${FILTER} | sed 's|\.|_|'`
	else
	   echo master
	fi
}

install_from_git() {
	[ $# -ne 1 ] && eargs quick
	local UPDATE=0
	local proto
	local bver
	local bverz
	local bhack

	[ -d ${JAILMNT}/usr/src ] && UPDATE=1
	mkdir -p ${JAILMNT}/usr/src
	mkdir -p ${JAILMNT}/dev
	cd ${JAILMNT}/usr/src
	if [ ${UPDATE} -eq 0 ]; then
		msg "Checking out the sources via git..."
		bver=$(convert_version ${VERSION})
		git init
		git remote add origin ${DFLY_GIT_URL}
		git fetch --depth=1 origin
		git branch ${bver} origin/${bver}
		git checkout ${bver}
		git pull || err 1 "Fail "
		echo " done"
	else
		msg "Updating the sources via git..."
		if [ -n "${TORELEASE}" ]; then
			bver=$(convert_version "${TORELEASE}")
			bverz=$(convert_property_version "${TORELEASE}")
			BAE=`git branch -l | grep ${bver}`
			if [ -z "${BAE}" ]; then
				git branch ${bver} origin/${bver}
			fi
			git checkout ${bver}
			jset ${JAILNAME} version ${bverz}
		fi
		git pull || err 1 "Fail "
		echo " done"
	fi
	mount -t devfs devfs ${JAILMNT}/dev
	build_and_install_world ${1}
	chroot ${JAILMNT} /sbin/ldconfig -m /lib /usr/lib
	umount ${JAILMNT}/dev
	bhack="$(date '+%Y-%m-%d/%H:%M')"
	jset ${JAILNAME} timestamp "${bhack}"
}

create_jail() {
	[ -z ${VERSION} ] && VERSION=master
	[ -z ${JAILMNT} ] && JAILMNT=${BASEFS}/jails/${JAILNAME}
	[ -z ${JAILFS} ] && JAILFS=${BASEFS}/worlds/${JAILNAME}

	case ${METHOD} in
	git)
		GIT=`which git`
		test -z ${GIT} && \
		  err 1 "You need git on your host to use this method"
		FCT="install_from_git 0"
		;;
	*)
		err 2 "Unknown method to create the jail"
		;;
	esac

	local bverz=$(convert_property_version "${VERSION}")
	createfs ${JAILNAME} ${JAILMNT} ${JAILFS:-none}
	[ -n "${JAILFS}" -a "${JAILFS}" != "none" ] && jset ${JAILNAME} fs ${JAILFS}
	jset ${JAILNAME} version ${bverz}
	jset ${JAILNAME} arch ${ARCH}
	jset ${JAILNAME} mnt ${JAILMNT}

	# Wrap the jail creation in a special cleanup hook that will remove the jail
	# if any error is encountered
	CLEANUP_HOOK=cleanup_new_jail
	jset ${JAILNAME} method ${METHOD}
	${FCT}

	eval `grep -E "^(RELEASE|BRANCH|REVISION)=" ${JAILMNT}/usr/src/sys/conf/newvers.sh `
	jset ${JAILNAME} version ${bverz}
	update_version ${RELEASE}

	pwd_mkdb -d ${JAILMNT}/etc/ -p ${JAILMNT}/etc/master.passwd

	cat > ${JAILMNT}/etc/make.conf << EOF
NO_BACKUP=yes
EOF
	# At least one daemon has to run otherwise jail will exits immediately
	# Let cron run over syslogd (remove "cron_enable=NO")
	cat > ${JAILMNT}/etc/rc.conf << EOF
sendmail_enable=NONE
syslogd_enable=NO
update_motd=NO
EOF
	echo "# dummy" 	            > ${JAILMNT}/etc/fstab
	echo "src"                  > ${JAILMNT}/usr/.cpignore
	echo "local"               >> ${JAILMNT}/usr/.cpignore
	echo "sys"                 >> ${JAILMNT}/.cpignore

	mkdir -p ${JAILMNT}/usr/ports
	mkdir -p ${JAILMNT}/wrkdirs
	mkdir -p ${POUDRIERE_DATA}/logs

	markfs clean ${JAILMNT}
	unset CLEANUP_HOOK
	msg "Jail ${JAILNAME} ${VERSION} ${ARCH} is ready to be used"
}