2 ###############################################################################
3 # IPFire.org - An Open Source Firewall Solution #
4 # Copyright (C) - IPFire Development Team <info@ipfire.org> #
5 ###############################################################################
9 SCRIPT_PATH
="$(dirname "$
(readlink
-f "$0")")"
13 .
"${SCRIPT_PATH}/settings.sh"
16 .
"${SCRIPT_PATH}/functions.sh"
21 log DEBUG
"Working dir is ${WORKING_DIR}"
27 # Check that pakfire is working
30 if ! check_for_free_space
10000 "${WORKING_DIR}"; then
34 # Check that the image does not exist yet
35 if [ -f ${IMAGE_BASE_FILE} ]; then
36 log ERROR
"Image file does already exists"
40 # Check that the local repo file does not exists yet.
41 # We do not want to override custom user configurations.
42 if [ -f "${LOCAL_REPO_FILE}" ]; then
43 log ERROR
"Config file ${LOCAL_REPO_FILE} for the local repo does already exists"
47 # cd into working directory
48 cd ${WORKING_DIR} ||
exit ${EXIT_ERROR}
51 ## Create the disk image.
53 dd if=/dev
/zero of
=${IMAGE_BASE_FILE} seek
=${IMAGE_SIZE}M count
=1k bs
=1
55 # Setup the loopback device.
56 outlo
=`losetup -f --show ${IMAGE_BASE_FILE}`
58 log INFO
"Create partions and filesystem"
60 # Create and msdos compatible table on the image.
61 parted
${outlo} mklabel msdos
63 # Add a new partition to the image.
64 parted
${outlo} mkpart primary
${FILESYSTEM} 2048k
100% -a minimal
66 # Make the primary partition bootable.
67 parted
${outlo} set 1 boot on
69 # Notify the kernel about the new partition.
73 ## Create the filesystem.
75 mkfs.
${FILESYSTEM} ${outlo}p1
78 ## Mount the filesystem.
81 log INFO
"Mount partion in ${IMAGE_MOUNT_DIR}"
83 # Afterwards mount the image.
84 mount
-t ${FILESYSTEM} ${outlo}p1 ${IMAGE_MOUNT_DIR}
87 ## Install IPFire 3.x.
90 # Add grub on x86_64 to the package list.
91 if [ "${ARCH}" == "x86_64" ] ||
[ "${ARCH}" == "i686" ]; then
92 PACKAGES
="${PACKAGES} grub"
94 # Store, that grub is present.
98 # Check if the git network stack should be installed.
99 if [ "${USE_GIT_NETWORK_STACK}" == "True" ]; then
100 GIT_REPOS
="${GIT_REPOS} git://git.ipfire.org/network.git"
102 # Add build dependencies of network package.
103 PACKAGES
="${PACKAGES} ${NETWORK_BUILD_DEPS}"
106 # Add develoment packes to the package list, if required.
107 if [ "${INSTALL_DEV_PACKAGES}" == "True" ] ||
[ ! -z "${GIT_REPOS}" ]; then
108 PACKAGES
="${PACKAGES} ${DEVELOPMENT_PACKAGES}"
111 log INFO
"Create local respository"
114 # Check if the local repo should be used.
115 if [ "${USE_LOCAL_REPO}" == "True" ]; then
116 # Create local repository.
117 mkdir
-pv "${LOCAL_REPO_DIR}"
120 if ! pakfire-server repo create
${LOCAL_REPO_DIR} ${LOCAL_REPO_SOURCE_PATH}; then
121 log ERROR
"Failed to create a local respository"
126 # Create temporary pakfire repo file.
127 echo "[repo:local]" >> "${LOCAL_REPO_FILE}"
128 echo "description = Local repository." >> "${LOCAL_REPO_FILE}"
129 echo "enabled = 0" >> "${LOCAL_REPO_FILE}"
130 echo "baseurl = ${LOCAL_REPO_DIR}" >> "${LOCAL_REPO_FILE}"
132 ENABLE_LOCAL
="--enable-repo=local"
135 # Install IPFire 3.x in the created image.
136 yes | pakfire
--root=${IMAGE_MOUNT_DIR} ${ENABLE_LOCAL} install @Base ${PACKAGES}
139 # Enable serial console
143 #echo "GRUB_TERMINAL=\"serial console\"" >> "${IMAGE_MOUNT_DIR}/etc/default/grub"
144 #echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=115200\"" >> "${IMAGE_MOUNT_DIR}/etc/default/grub"
146 #Hack to install a /etc/default/grub file
148 cmd
cp -f "${SCRIPT_PATH}/grub" "${IMAGE_MOUNT_DIR}/etc/default"
154 # Gather the uuid of the partition.
155 FS_UUID
=$
(blkid
-o value
-s UUID
${outlo}p1
)
158 echo "UUID=${FS_UUID} / ${FILESYSTEM} defaults 0 0" > "${IMAGE_MOUNT_DIR}/etc/fstab"
160 cat "${IMAGE_MOUNT_DIR}/etc/fstab"
163 ## Remove the password for user root.
166 reset_root_password
"${IMAGE_MOUNT_DIR}"
169 ## Setup git repositories.
172 clone_git_repos
"${IMAGE_MOUNT_DIR}/build" ${GIT_REPOS}
175 ## Prepare chrooting into the image.
178 # Check if the network stack should be build.
179 if [ "${USE_GIT_NETWORK_STACK}" == "True" ]; then
180 BUILD_NETWORK_CMDS
="cd network/ && ./autogen.sh && ./configure && make && make install"
183 ENABLE_GETTY
="/bin/systemctl enable getty@.service"
185 # Check if the arch uses grub
186 if [ "${HAVE_GRUB}" == "True" ]; then
187 GENERATE_GRUB_CONF
="grub-install --boot-directory=${IMAGE_MOUNT_DIR}/boot/ --modules="${FILESYSTEM} part_msdos" ${outlo} && \
188 grub-mkconfig -o /boot/grub/grub.cfg"
192 # Use systemd-nspawn to spawn a chroot environment and execute
193 # commands inside it.
195 # The first command enables the terminal on TTY1.
196 # The second command generates the configuration file for grub2.
199 systemd-nspawn
-D ${IMAGE_MOUNT_DIR} --bind /dev
--capability=CAP_SYS_ADMIN
,CAP_SYS_RAWIO
--bind /proc
--bind /sys
<< END
200 echo "Execute commands inside chroot"
202 ${GENERATE_GRUB_CONF}
204 ${BUILD_NETWORK_CMDS}
205 echo "All commands executed"
210 # Insert the UUID because grub-mkconfig often fails to
211 # detect that correctly
213 sed -i "${IMAGE_MOUNT_DIR}/boot/grub/grub.cfg" \
214 -e "s/root=[A-Za-z0-9\/=-]*/root=UUID=${FS_UUID}/g"
216 cat "${IMAGE_MOUNT_DIR}/boot/grub/grub.cfg"
218 cat "${IMAGE_MOUNT_DIR}/etc/fstab"
228 # Check filesystem for damage.
229 fsck.
${FILESYSTEM} ${outlo}p1
233 publish
"${IMAGE_DIR_PUBLISH}" "${IMAGE_BASE_FILE}"