diff options
Diffstat (limited to 'meta/classes/image.bbclass')
-rw-r--r-- | meta/classes/image.bbclass | 448 |
1 files changed, 448 insertions, 0 deletions
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass new file mode 100644 index 0000000000..1c0fda7d60 --- /dev/null +++ b/meta/classes/image.bbclass | |||
@@ -0,0 +1,448 @@ | |||
1 | inherit rootfs_${IMAGE_PKGTYPE} | ||
2 | |||
3 | inherit populate_sdk_base | ||
4 | |||
5 | TOOLCHAIN_TARGET_TASK += "${PACKAGE_INSTALL}" | ||
6 | TOOLCHAIN_TARGET_TASK_ATTEMPTONLY += "${PACKAGE_INSTALL_ATTEMPTONLY}" | ||
7 | POPULATE_SDK_POST_TARGET_COMMAND += "rootfs_sysroot_relativelinks; " | ||
8 | |||
9 | inherit gzipnative | ||
10 | |||
11 | LICENSE = "MIT" | ||
12 | PACKAGES = "" | ||
13 | DEPENDS += "${MLPREFIX}qemuwrapper-cross ${MLPREFIX}depmodwrapper-cross" | ||
14 | RDEPENDS += "${PACKAGE_INSTALL} ${LINGUAS_INSTALL}" | ||
15 | RRECOMMENDS += "${PACKAGE_INSTALL_ATTEMPTONLY}" | ||
16 | |||
17 | INHIBIT_DEFAULT_DEPS = "1" | ||
18 | |||
19 | TESTIMAGECLASS = "${@base_conditional('TEST_IMAGE', '1', 'testimage-auto', '', d)}" | ||
20 | inherit ${TESTIMAGECLASS} | ||
21 | |||
22 | # IMAGE_FEATURES may contain any available package group | ||
23 | IMAGE_FEATURES ?= "" | ||
24 | IMAGE_FEATURES[type] = "list" | ||
25 | IMAGE_FEATURES[validitems] += "debug-tweaks read-only-rootfs" | ||
26 | |||
27 | # rootfs bootstrap install | ||
28 | ROOTFS_BOOTSTRAP_INSTALL = "${@bb.utils.contains("IMAGE_FEATURES", "package-management", "", "${ROOTFS_PKGMANAGE_BOOTSTRAP}",d)}" | ||
29 | |||
30 | # packages to install from features | ||
31 | FEATURE_INSTALL = "${@' '.join(oe.packagegroup.required_packages(oe.data.typed_value('IMAGE_FEATURES', d), d))}" | ||
32 | FEATURE_INSTALL_OPTIONAL = "${@' '.join(oe.packagegroup.optional_packages(oe.data.typed_value('IMAGE_FEATURES', d), d))}" | ||
33 | |||
34 | # Define some very basic feature package groups | ||
35 | FEATURE_PACKAGES_package-management = "${ROOTFS_PKGMANAGE}" | ||
36 | SPLASH ?= "psplash" | ||
37 | FEATURE_PACKAGES_splash = "${SPLASH}" | ||
38 | |||
39 | IMAGE_INSTALL_COMPLEMENTARY = '${@complementary_globs("IMAGE_FEATURES", d)}' | ||
40 | |||
41 | def check_image_features(d): | ||
42 | valid_features = (d.getVarFlag('IMAGE_FEATURES', 'validitems', True) or "").split() | ||
43 | valid_features += d.getVarFlags('COMPLEMENTARY_GLOB').keys() | ||
44 | for var in d: | ||
45 | if var.startswith("PACKAGE_GROUP_"): | ||
46 | bb.warn("PACKAGE_GROUP is deprecated, please use FEATURE_PACKAGES instead") | ||
47 | valid_features.append(var[14:]) | ||
48 | elif var.startswith("FEATURE_PACKAGES_"): | ||
49 | valid_features.append(var[17:]) | ||
50 | valid_features.sort() | ||
51 | |||
52 | features = set(oe.data.typed_value('IMAGE_FEATURES', d)) | ||
53 | for feature in features: | ||
54 | if feature not in valid_features: | ||
55 | bb.fatal("'%s' in IMAGE_FEATURES is not a valid image feature. Valid features: %s" % (feature, ' '.join(valid_features))) | ||
56 | |||
57 | IMAGE_INSTALL ?= "" | ||
58 | IMAGE_INSTALL[type] = "list" | ||
59 | export PACKAGE_INSTALL ?= "${IMAGE_INSTALL} ${ROOTFS_BOOTSTRAP_INSTALL} ${FEATURE_INSTALL}" | ||
60 | PACKAGE_INSTALL_ATTEMPTONLY ?= "${FEATURE_INSTALL_OPTIONAL}" | ||
61 | |||
62 | # Images are generally built explicitly, do not need to be part of world. | ||
63 | EXCLUDE_FROM_WORLD = "1" | ||
64 | |||
65 | USE_DEVFS ?= "1" | ||
66 | |||
67 | PID = "${@os.getpid()}" | ||
68 | |||
69 | PACKAGE_ARCH = "${MACHINE_ARCH}" | ||
70 | |||
71 | LDCONFIGDEPEND ?= "ldconfig-native:do_populate_sysroot" | ||
72 | LDCONFIGDEPEND_libc-uclibc = "" | ||
73 | LDCONFIGDEPEND_libc-musl = "" | ||
74 | |||
75 | do_rootfs[depends] += "makedevs-native:do_populate_sysroot virtual/fakeroot-native:do_populate_sysroot ${LDCONFIGDEPEND}" | ||
76 | do_rootfs[depends] += "virtual/update-alternatives-native:do_populate_sysroot update-rc.d-native:do_populate_sysroot" | ||
77 | do_rootfs[recrdeptask] += "do_packagedata" | ||
78 | |||
79 | def command_variables(d): | ||
80 | return ['ROOTFS_POSTPROCESS_COMMAND','ROOTFS_PREPROCESS_COMMAND','ROOTFS_POSTINSTALL_COMMAND','OPKG_PREPROCESS_COMMANDS','OPKG_POSTPROCESS_COMMANDS','IMAGE_POSTPROCESS_COMMAND', | ||
81 | 'IMAGE_PREPROCESS_COMMAND','ROOTFS_POSTPROCESS_COMMAND','POPULATE_SDK_POST_HOST_COMMAND','POPULATE_SDK_POST_TARGET_COMMAND','SDK_POSTPROCESS_COMMAND','RPM_PREPROCESS_COMMANDS', | ||
82 | 'RPM_POSTPROCESS_COMMANDS'] | ||
83 | |||
84 | python () { | ||
85 | variables = command_variables(d) | ||
86 | for var in variables: | ||
87 | if d.getVar(var): | ||
88 | d.setVarFlag(var, 'func', '1') | ||
89 | } | ||
90 | |||
91 | def rootfs_variables(d): | ||
92 | from oe.rootfs import variable_depends | ||
93 | variables = ['IMAGE_DEVICE_TABLES','BUILD_IMAGES_FROM_FEEDS','IMAGE_TYPEDEP_','IMAGE_TYPES_MASKED','IMAGE_ROOTFS_ALIGNMENT','IMAGE_OVERHEAD_FACTOR','IMAGE_ROOTFS_SIZE','IMAGE_ROOTFS_EXTRA_SPACE', | ||
94 | 'IMAGE_ROOTFS_MAXSIZE','IMAGE_NAME','IMAGE_LINK_NAME','IMAGE_MANIFEST','DEPLOY_DIR_IMAGE','RM_OLD_IMAGE','IMAGE_FSTYPES','IMAGE_INSTALL_COMPLEMENTARY','IMAGE_LINGUAS','SDK_OS', | ||
95 | 'SDK_OUTPUT','SDKPATHNATIVE','SDKTARGETSYSROOT','SDK_DIR','SDK_VENDOR','SDKIMAGE_INSTALL_COMPLEMENTARY','SDK_PACKAGE_ARCHS','SDK_OUTPUT','SDKTARGETSYSROOT','MULTILIBRE_ALLOW_REP', | ||
96 | 'MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS', | ||
97 | 'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','BUILDNAME','USE_DEVFS', | ||
98 | 'STAGING_KERNEL_DIR','COMPRESSIONTYPES'] | ||
99 | variables.extend(command_variables(d)) | ||
100 | variables.extend(variable_depends(d)) | ||
101 | return " ".join(variables) | ||
102 | |||
103 | do_rootfs[vardeps] += "${@rootfs_variables(d)}" | ||
104 | |||
105 | do_build[depends] += "virtual/kernel:do_deploy" | ||
106 | |||
107 | def build_live(d): | ||
108 | if bb.utils.contains("IMAGE_FSTYPES", "live", "live", "0", d) == "0": # live is not set but hob might set iso or hddimg | ||
109 | d.setVar('NOISO', bb.utils.contains('IMAGE_FSTYPES', "iso", "0", "1", d)) | ||
110 | d.setVar('NOHDD', bb.utils.contains('IMAGE_FSTYPES', "hddimg", "0", "1", d)) | ||
111 | if d.getVar('NOISO', True) == "0" or d.getVar('NOHDD', True) == "0": | ||
112 | return "image-live" | ||
113 | return "" | ||
114 | return "image-live" | ||
115 | |||
116 | IMAGE_TYPE_live = "${@build_live(d)}" | ||
117 | |||
118 | inherit ${IMAGE_TYPE_live} | ||
119 | IMAGE_TYPE_vmdk = '${@bb.utils.contains("IMAGE_FSTYPES", "vmdk", "image-vmdk", "", d)}' | ||
120 | inherit ${IMAGE_TYPE_vmdk} | ||
121 | |||
122 | python () { | ||
123 | deps = " " + imagetypes_getdepends(d) | ||
124 | d.appendVarFlag('do_rootfs', 'depends', deps) | ||
125 | |||
126 | deps = "" | ||
127 | for dep in (d.getVar('EXTRA_IMAGEDEPENDS', True) or "").split(): | ||
128 | deps += " %s:do_populate_sysroot" % dep | ||
129 | d.appendVarFlag('do_build', 'depends', deps) | ||
130 | |||
131 | #process IMAGE_FEATURES, we must do this before runtime_mapping_rename | ||
132 | #Check for replaces image features | ||
133 | features = set(oe.data.typed_value('IMAGE_FEATURES', d)) | ||
134 | remain_features = features.copy() | ||
135 | for feature in features: | ||
136 | replaces = set((d.getVar("IMAGE_FEATURES_REPLACES_%s" % feature, True) or "").split()) | ||
137 | remain_features -= replaces | ||
138 | |||
139 | #Check for conflict image features | ||
140 | for feature in remain_features: | ||
141 | conflicts = set((d.getVar("IMAGE_FEATURES_CONFLICTS_%s" % feature, True) or "").split()) | ||
142 | temp = conflicts & remain_features | ||
143 | if temp: | ||
144 | bb.fatal("%s contains conflicting IMAGE_FEATURES %s %s" % (d.getVar('PN', True), feature, ' '.join(list(temp)))) | ||
145 | |||
146 | d.setVar('IMAGE_FEATURES', ' '.join(list(remain_features))) | ||
147 | |||
148 | check_image_features(d) | ||
149 | initramfs_image = d.getVar('INITRAMFS_IMAGE', True) or "" | ||
150 | if initramfs_image != "": | ||
151 | d.appendVarFlag('do_build', 'depends', " %s:do_bundle_initramfs" % d.getVar('PN', True)) | ||
152 | d.appendVarFlag('do_bundle_initramfs', 'depends', " %s:do_rootfs" % initramfs_image) | ||
153 | } | ||
154 | |||
155 | IMAGE_CLASSES += "image_types" | ||
156 | inherit ${IMAGE_CLASSES} | ||
157 | |||
158 | IMAGE_POSTPROCESS_COMMAND ?= "" | ||
159 | MACHINE_POSTPROCESS_COMMAND ?= "" | ||
160 | # Allow dropbear/openssh to accept logins from accounts with an empty password string if debug-tweaks is enabled | ||
161 | ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "debug-tweaks", "ssh_allow_empty_password; ", "",d)}' | ||
162 | # Enable postinst logging if debug-tweaks is enabled | ||
163 | ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "debug-tweaks", "postinst_enable_logging; ", "",d)}' | ||
164 | # Write manifest | ||
165 | IMAGE_MANIFEST = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.manifest" | ||
166 | ROOTFS_POSTPROCESS_COMMAND =+ "write_image_manifest ; " | ||
167 | # Set default postinst log file | ||
168 | POSTINST_LOGFILE ?= "${localstatedir}/log/postinstall.log" | ||
169 | # Set default target for systemd images | ||
170 | SYSTEMD_DEFAULT_TARGET ?= '${@bb.utils.contains("IMAGE_FEATURES", "x11-base", "graphical.target", "multi-user.target", d)}' | ||
171 | ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("DISTRO_FEATURES", "systemd", "set_systemd_default_target; ", "", d)}' | ||
172 | |||
173 | # some default locales | ||
174 | IMAGE_LINGUAS ?= "de-de fr-fr en-gb" | ||
175 | |||
176 | LINGUAS_INSTALL ?= "${@" ".join(map(lambda s: "locale-base-%s" % s, d.getVar('IMAGE_LINGUAS', True).split()))}" | ||
177 | |||
178 | # Prefer image, but use the fallback files for lookups if the image ones | ||
179 | # aren't yet available. | ||
180 | PSEUDO_PASSWD = "${IMAGE_ROOTFS}:${STAGING_DIR_NATIVE}" | ||
181 | |||
182 | do_rootfs[dirs] = "${TOPDIR}" | ||
183 | do_rootfs[lockfiles] += "${IMAGE_ROOTFS}.lock" | ||
184 | do_rootfs[cleandirs] += "${S}" | ||
185 | |||
186 | # Must call real_do_rootfs() from inside here, rather than as a separate | ||
187 | # task, so that we have a single fakeroot context for the whole process. | ||
188 | do_rootfs[umask] = "022" | ||
189 | |||
190 | # A hook function to support read-only-rootfs IMAGE_FEATURES | ||
191 | # Currently, it only supports sysvinit system. | ||
192 | read_only_rootfs_hook () { | ||
193 | # Tweak the mount option and fs_passno for rootfs in fstab | ||
194 | sed -i -e '/^[#[:space:]]*\/dev\/root/{s/defaults/ro/;s/\([[:space:]]*[[:digit:]]\)\([[:space:]]*\)[[:digit:]]$/\1\20/}' ${IMAGE_ROOTFS}/etc/fstab | ||
195 | |||
196 | if ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "true", "false", d)}; then | ||
197 | # Change the value of ROOTFS_READ_ONLY in /etc/default/rcS to yes | ||
198 | if [ -e ${IMAGE_ROOTFS}/etc/default/rcS ]; then | ||
199 | sed -i 's/ROOTFS_READ_ONLY=no/ROOTFS_READ_ONLY=yes/' ${IMAGE_ROOTFS}/etc/default/rcS | ||
200 | fi | ||
201 | # Run populate-volatile.sh at rootfs time to set up basic files | ||
202 | # and directories to support read-only rootfs. | ||
203 | if [ -x ${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh ]; then | ||
204 | ${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh | ||
205 | fi | ||
206 | # If we're using openssh and the /etc/ssh directory has no pre-generated keys, | ||
207 | # we should configure openssh to use the configuration file /etc/ssh/sshd_config_readonly | ||
208 | # and the keys under /var/run/ssh. | ||
209 | if [ -d ${IMAGE_ROOTFS}/etc/ssh ]; then | ||
210 | if [ -e ${IMAGE_ROOTFS}/etc/ssh/ssh_host_rsa_key ]; then | ||
211 | echo "SYSCONFDIR=/etc/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh | ||
212 | echo "SSHD_OPTS=" >> ${IMAGE_ROOTFS}/etc/default/ssh | ||
213 | else | ||
214 | echo "SYSCONFDIR=/var/run/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh | ||
215 | echo "SSHD_OPTS='-f /etc/ssh/sshd_config_readonly'" >> ${IMAGE_ROOTFS}/etc/default/ssh | ||
216 | fi | ||
217 | fi | ||
218 | fi | ||
219 | |||
220 | if ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "true", "false", d)}; then | ||
221 | # Update user database files so that services don't fail for a read-only systemd system | ||
222 | for conffile in ${IMAGE_ROOTFS}/usr/lib/sysusers.d/systemd.conf ${IMAGE_ROOTFS}/usr/lib/sysusers.d/systemd-remote.conf; do | ||
223 | [ -e $conffile ] || continue | ||
224 | grep -v "^#" $conffile | sed -e '/^$/d' | while read type name id comment; do | ||
225 | if [ "$type" = "u" ]; then | ||
226 | useradd_params="" | ||
227 | [ "$id" != "-" ] && useradd_params="$useradd_params --uid $id" | ||
228 | [ "$comment" != "-" ] && useradd_params="$useradd_params --comment $comment" | ||
229 | useradd_params="$useradd_params --system $name" | ||
230 | eval useradd --root ${IMAGE_ROOTFS} $useradd_params || true | ||
231 | elif [ "$type" = "g" ]; then | ||
232 | groupadd_params="" | ||
233 | [ "$id" != "-" ] && groupadd_params="$groupadd_params --gid $id" | ||
234 | groupadd_params="$groupadd_params --system $name" | ||
235 | eval groupadd --root ${IMAGE_ROOTFS} $groupadd_params || true | ||
236 | fi | ||
237 | done | ||
238 | done | ||
239 | fi | ||
240 | } | ||
241 | |||
242 | PACKAGE_EXCLUDE ??= "" | ||
243 | PACKAGE_EXCLUDE[type] = "list" | ||
244 | |||
245 | python rootfs_process_ignore() { | ||
246 | excl_pkgs = d.getVar("PACKAGE_EXCLUDE", True).split() | ||
247 | inst_pkgs = d.getVar("PACKAGE_INSTALL", True).split() | ||
248 | inst_attempt_pkgs = d.getVar("PACKAGE_INSTALL_ATTEMPTONLY", True).split() | ||
249 | |||
250 | d.setVar('PACKAGE_INSTALL_ORIG', ' '.join(inst_pkgs)) | ||
251 | d.setVar('PACKAGE_INSTALL_ATTEMPTONLY', ' '.join(inst_attempt_pkgs)) | ||
252 | |||
253 | for pkg in excl_pkgs: | ||
254 | if pkg in inst_pkgs: | ||
255 | bb.warn("Package %s, set to be excluded, is in %s PACKAGE_INSTALL (%s). It will be removed from the list." % (pkg, d.getVar('PN', True), inst_pkgs)) | ||
256 | inst_pkgs.remove(pkg) | ||
257 | |||
258 | if pkg in inst_attempt_pkgs: | ||
259 | bb.warn("Package %s, set to be excluded, is in %s PACKAGE_INSTALL_ATTEMPTONLY (%s). It will be removed from the list." % (pkg, d.getVar('PN', True), inst_pkgs)) | ||
260 | inst_attempt_pkgs.remove(pkg) | ||
261 | |||
262 | d.setVar("PACKAGE_INSTALL", ' '.join(inst_pkgs)) | ||
263 | d.setVar("PACKAGE_INSTALL_ATTEMPTONLY", ' '.join(inst_attempt_pkgs)) | ||
264 | } | ||
265 | do_rootfs[prefuncs] += "rootfs_process_ignore" | ||
266 | |||
267 | # We have to delay the runtime_mapping_rename until just before rootfs runs | ||
268 | # otherwise, the multilib renaming could step in and squash any fixups that | ||
269 | # may have occurred. | ||
270 | python rootfs_runtime_mapping() { | ||
271 | pn = d.getVar('PN', True) | ||
272 | runtime_mapping_rename("PACKAGE_INSTALL", pn, d) | ||
273 | runtime_mapping_rename("PACKAGE_INSTALL_ATTEMPTONLY", pn, d) | ||
274 | runtime_mapping_rename("BAD_RECOMMENDATIONS", pn, d) | ||
275 | } | ||
276 | do_rootfs[prefuncs] += "rootfs_runtime_mapping" | ||
277 | |||
278 | fakeroot python do_rootfs () { | ||
279 | from oe.rootfs import create_rootfs | ||
280 | from oe.image import create_image | ||
281 | from oe.manifest import create_manifest | ||
282 | |||
283 | # generate the initial manifest | ||
284 | create_manifest(d) | ||
285 | |||
286 | # generate rootfs | ||
287 | create_rootfs(d) | ||
288 | |||
289 | # generate final images | ||
290 | create_image(d) | ||
291 | } | ||
292 | |||
293 | insert_feed_uris () { | ||
294 | |||
295 | echo "Building feeds for [${DISTRO}].." | ||
296 | |||
297 | for line in ${FEED_URIS} | ||
298 | do | ||
299 | # strip leading and trailing spaces/tabs, then split into name and uri | ||
300 | line_clean="`echo "$line"|sed 's/^[ \t]*//;s/[ \t]*$//'`" | ||
301 | feed_name="`echo "$line_clean" | sed -n 's/\(.*\)##\(.*\)/\1/p'`" | ||
302 | feed_uri="`echo "$line_clean" | sed -n 's/\(.*\)##\(.*\)/\2/p'`" | ||
303 | |||
304 | echo "Added $feed_name feed with URL $feed_uri" | ||
305 | |||
306 | # insert new feed-sources | ||
307 | echo "src/gz $feed_name $feed_uri" >> ${IMAGE_ROOTFS}/etc/opkg/${feed_name}-feed.conf | ||
308 | done | ||
309 | } | ||
310 | |||
311 | MULTILIBRE_ALLOW_REP =. "${base_bindir}|${base_sbindir}|${bindir}|${sbindir}|${libexecdir}|${sysconfdir}|${nonarch_base_libdir}/udev|/lib/modules/[^/]*/modules.*|" | ||
312 | MULTILIB_CHECK_FILE = "${WORKDIR}/multilib_check.py" | ||
313 | MULTILIB_TEMP_ROOTFS = "${WORKDIR}/multilib" | ||
314 | |||
315 | # This function is intended to disallow empty root password if 'debug-tweaks' is not in IMAGE_FEATURES. | ||
316 | zap_empty_root_password () { | ||
317 | if [ -e ${IMAGE_ROOTFS}/etc/shadow ]; then | ||
318 | sed -i 's%^root::%root:*:%' ${IMAGE_ROOTFS}/etc/shadow | ||
319 | elif [ -e ${IMAGE_ROOTFS}/etc/passwd ]; then | ||
320 | sed -i 's%^root::%root:*:%' ${IMAGE_ROOTFS}/etc/passwd | ||
321 | fi | ||
322 | } | ||
323 | |||
324 | # allow dropbear/openssh to accept root logins and logins from accounts with an empty password string | ||
325 | ssh_allow_empty_password () { | ||
326 | if [ -e ${IMAGE_ROOTFS}${sysconfdir}/ssh/sshd_config ]; then | ||
327 | sed -i 's/^[#[:space:]]*PermitRootLogin.*/PermitRootLogin yes/' ${IMAGE_ROOTFS}${sysconfdir}/ssh/sshd_config | ||
328 | sed -i 's/^[#[:space:]]*PermitEmptyPasswords.*/PermitEmptyPasswords yes/' ${IMAGE_ROOTFS}${sysconfdir}/ssh/sshd_config | ||
329 | fi | ||
330 | |||
331 | if [ -e ${IMAGE_ROOTFS}${sbindir}/dropbear ] ; then | ||
332 | if grep -q DROPBEAR_EXTRA_ARGS ${IMAGE_ROOTFS}${sysconfdir}/default/dropbear 2>/dev/null ; then | ||
333 | if ! grep -q "DROPBEAR_EXTRA_ARGS=.*-B" ${IMAGE_ROOTFS}${sysconfdir}/default/dropbear ; then | ||
334 | sed -i 's/^DROPBEAR_EXTRA_ARGS="*\([^"]*\)"*/DROPBEAR_EXTRA_ARGS="\1 -B"/' ${IMAGE_ROOTFS}${sysconfdir}/default/dropbear | ||
335 | fi | ||
336 | else | ||
337 | printf '\nDROPBEAR_EXTRA_ARGS="-B"\n' >> ${IMAGE_ROOTFS}${sysconfdir}/default/dropbear | ||
338 | fi | ||
339 | fi | ||
340 | |||
341 | if [ -d ${IMAGE_ROOTFS}${sysconfdir}/pam.d ] ; then | ||
342 | sed -i 's/nullok_secure/nullok/' ${IMAGE_ROOTFS}${sysconfdir}/pam.d/* | ||
343 | fi | ||
344 | } | ||
345 | |||
346 | # Disable DNS lookups, the SSH_DISABLE_DNS_LOOKUP can be overridden to allow | ||
347 | # distros to choose not to take this change | ||
348 | SSH_DISABLE_DNS_LOOKUP ?= " ssh_disable_dns_lookup ; " | ||
349 | ROOTFS_POSTPROCESS_COMMAND_append_qemuall = "${SSH_DISABLE_DNS_LOOKUP}" | ||
350 | ssh_disable_dns_lookup () { | ||
351 | if [ -e ${IMAGE_ROOTFS}${sysconfdir}/ssh/sshd_config ]; then | ||
352 | sed -i -e 's:#UseDNS yes:UseDNS no:' ${IMAGE_ROOTFS}${sysconfdir}/ssh/sshd_config | ||
353 | fi | ||
354 | } | ||
355 | |||
356 | # Enable postinst logging if debug-tweaks is enabled | ||
357 | postinst_enable_logging () { | ||
358 | mkdir -p ${IMAGE_ROOTFS}${sysconfdir}/default | ||
359 | echo "POSTINST_LOGGING=1" >> ${IMAGE_ROOTFS}${sysconfdir}/default/postinst | ||
360 | echo "LOGFILE=${POSTINST_LOGFILE}" >> ${IMAGE_ROOTFS}${sysconfdir}/default/postinst | ||
361 | } | ||
362 | |||
363 | # Modify systemd default target | ||
364 | set_systemd_default_target () { | ||
365 | if [ -d ${IMAGE_ROOTFS}${sysconfdir}/systemd/system -a -e ${IMAGE_ROOTFS}${systemd_unitdir}/system/${SYSTEMD_DEFAULT_TARGET} ]; then | ||
366 | ln -sf ${systemd_unitdir}/system/${SYSTEMD_DEFAULT_TARGET} ${IMAGE_ROOTFS}${sysconfdir}/systemd/system/default.target | ||
367 | fi | ||
368 | } | ||
369 | |||
370 | # Turn any symbolic /sbin/init link into a file | ||
371 | remove_init_link () { | ||
372 | if [ -h ${IMAGE_ROOTFS}/sbin/init ]; then | ||
373 | LINKFILE=${IMAGE_ROOTFS}`readlink ${IMAGE_ROOTFS}/sbin/init` | ||
374 | rm ${IMAGE_ROOTFS}/sbin/init | ||
375 | cp $LINKFILE ${IMAGE_ROOTFS}/sbin/init | ||
376 | fi | ||
377 | } | ||
378 | |||
379 | make_zimage_symlink_relative () { | ||
380 | if [ -L ${IMAGE_ROOTFS}/boot/zImage ]; then | ||
381 | (cd ${IMAGE_ROOTFS}/boot/ && for i in `ls zImage-* | sort`; do ln -sf $i zImage; done) | ||
382 | fi | ||
383 | } | ||
384 | |||
385 | python write_image_manifest () { | ||
386 | from oe.rootfs import image_list_installed_packages | ||
387 | with open(d.getVar('IMAGE_MANIFEST', True), 'w+') as image_manifest: | ||
388 | image_manifest.write(image_list_installed_packages(d, 'ver')) | ||
389 | } | ||
390 | |||
391 | # Make login manager(s) enable automatic login. | ||
392 | # Useful for devices where we do not want to log in at all (e.g. phones) | ||
393 | set_image_autologin () { | ||
394 | sed -i 's%^AUTOLOGIN=\"false"%AUTOLOGIN="true"%g' ${IMAGE_ROOTFS}/etc/sysconfig/gpelogin | ||
395 | } | ||
396 | |||
397 | # Can be use to create /etc/timestamp during image construction to give a reasonably | ||
398 | # sane default time setting | ||
399 | rootfs_update_timestamp () { | ||
400 | date -u +%4Y%2m%2d%2H%2M%2S >${IMAGE_ROOTFS}/etc/timestamp | ||
401 | } | ||
402 | |||
403 | # Prevent X from being started | ||
404 | rootfs_no_x_startup () { | ||
405 | if [ -f ${IMAGE_ROOTFS}/etc/init.d/xserver-nodm ]; then | ||
406 | chmod a-x ${IMAGE_ROOTFS}/etc/init.d/xserver-nodm | ||
407 | fi | ||
408 | } | ||
409 | |||
410 | rootfs_trim_schemas () { | ||
411 | for schema in ${IMAGE_ROOTFS}/etc/gconf/schemas/*.schemas | ||
412 | do | ||
413 | # Need this in case no files exist | ||
414 | if [ -e $schema ]; then | ||
415 | oe-trim-schemas $schema > $schema.new | ||
416 | mv $schema.new $schema | ||
417 | fi | ||
418 | done | ||
419 | } | ||
420 | |||
421 | # Make any absolute links in a sysroot relative | ||
422 | rootfs_sysroot_relativelinks () { | ||
423 | sysroot-relativelinks.py ${SDK_OUTPUT}/${SDKTARGETSYSROOT} | ||
424 | } | ||
425 | |||
426 | do_fetch[noexec] = "1" | ||
427 | do_unpack[noexec] = "1" | ||
428 | do_patch[noexec] = "1" | ||
429 | do_configure[noexec] = "1" | ||
430 | do_compile[noexec] = "1" | ||
431 | do_install[noexec] = "1" | ||
432 | do_populate_sysroot[noexec] = "1" | ||
433 | do_package[noexec] = "1" | ||
434 | do_package_qa[noexec] = "1" | ||
435 | do_packagedata[noexec] = "1" | ||
436 | do_package_write_ipk[noexec] = "1" | ||
437 | do_package_write_deb[noexec] = "1" | ||
438 | do_package_write_rpm[noexec] = "1" | ||
439 | |||
440 | addtask rootfs before do_build | ||
441 | # Allow the kernel to be repacked with the initramfs and boot image file as a single file | ||
442 | do_bundle_initramfs[depends] += "virtual/kernel:do_bundle_initramfs" | ||
443 | do_bundle_initramfs[nostamp] = "1" | ||
444 | do_bundle_initramfs[noexec] = "1" | ||
445 | do_bundle_initramfs () { | ||
446 | : | ||
447 | } | ||
448 | addtask bundle_initramfs after do_rootfs | ||