# Copyright (C) 2021 The Android Open Source Project
#
# init.rc for microdroid. This contains a minimal script plus basic service definitions (e.g. apexd)
# needed for microdroid to run.
# TODO(b/179340780): support APEX init scripts
#
# IMPORTANT: Do not create world writable files or directories.
# This is a common source of Android security bugs.
#

import /init.environ.rc

# Cgroups are mounted right before early-init using list from /etc/cgroups.json
on early-init
    # Android doesn't need kernel module autoloading, and it causes SELinux
    # denials.  So disable it by setting modprobe to the empty string.  Note: to
    # explicitly set a sysctl to an empty string, a trailing newline is needed.
    write /proc/sys/kernel/modprobe \n

    # set RLIMIT_NICE to allow priorities from 19 to -20
    setrlimit nice 40 40

    start ueventd

    # Generate empty linker config to suppress warnings
    write /linkerconfig/ld.config.txt \#
    chmod 644 /linkerconfig/ld.config.txt

    # Applies debug policy to decide whether to enable adb, adb root, and logcat.
    # We don't directly exec the binary to specify stdio_to_kmsg.
    exec_start init_debug_policy

    # Wait for ueventd to have finished cold boot.
    # This is needed by prng-seeder (at least).
    # (In Android this happens inside apexd-bootstrap.)
    wait_for_prop ro.cold_boot_done true

on init
    mkdir /mnt/apk 0755 root root
    mkdir /mnt/extra-apk 0755 root root

    # Allow the payload access to the console (default is 0600)
    chmod 0666 /dev/console

    # Microdroid_manager starts apkdmverity/zipfuse/apexd
    start microdroid_manager

    # Wait for apexd to finish activating APEXes before starting more processes.
    # Microdroid starts apexd in VM mode in which apexd doesn't wait for init after setting
    # apexd.status to activated, but immediately transitions to ready. Therefore, it's not safe to
    # wait for the activated status, by the time this line is reached it may be already be ready.
    wait_for_prop apexd.status ready
    perform_apex_config

    # Notify to microdroid_manager that perform_apex_config is done.
    # Microdroid_manager shouldn't execute payload before this, because app
    # payloads are not designed to run with bootstrap bionic
    setprop apex_config.done true

on property:microdroid_manager.init_done=1
    # Stop ueventd to save memory
    stop ueventd

on init && property:ro.boot.microdroid.debuggable=1
    # Mount tracefs (with GID=AID_READTRACEFS)
    mount tracefs tracefs /sys/kernel/tracing gid=3012

on property:init_debug_policy.adbd.enabled=1
    start adbd

# Mount filesystems and start core system services.
on late-init
    trigger early-fs

    # Mount fstab in init.{$device}.rc by mount_all command. Optional parameter
    # '--early' can be specified to skip entries with 'latemount'.
    # /system and /vendor must be mounted by the end of the fs stage,
    # while /data is optional.
    trigger fs
    trigger post-fs

    # Mount fstab in init.{$device}.rc by mount_all with '--late' parameter
    # to only mount entries with 'latemount'. This is needed if '--early' is
    # specified in the previous mount_all command on the fs stage.
    # With /system mounted and properties form /system + /factory available,
    # some services can be started.
    trigger late-fs

    # Wait for microdroid_manager to finish setting up sysprops from the payload config.
    # Some further actions in the boot sequence might depend on the sysprops from the payloag,
    # e.g. microdroid.config.enable_authfs configures whether to run authfs_service after
    # /data is mounted.
    wait_for_prop microdroid_manager.config_done 1

    trigger post-fs-data

    trigger early-boot
    trigger boot

on post-fs
    # Once everything is setup, no need to modify /.
    # The bind+remount combination allows this to work in containers.
    mount rootfs rootfs / remount bind ro nodev

    # TODO(b/185767624): change the hard-coded size?
    mount tmpfs tmpfs /data noatime nosuid nodev noexec rw size=128M

    # We chown/chmod /data again so because mount is run as root + defaults
    chown system system /data
    chmod 0771 /data

    # We restorecon /data in case the userdata partition has been reset.
    restorecon /data

    # set up misc directory structure first so that we can end early boot
    # and start apexd
    mkdir /data/misc 01771 system misc
    # work around b/183668221
    restorecon /data/misc

    mkdir /data/misc/authfs 0700 root root

on late-fs && property:ro.debuggable=1
    # Ensure that tracefs has the correct permissions.
    # This does not work correctly if it is called in post-fs.
    chmod 0755 /sys/kernel/tracing
    chmod 0755 /sys/kernel/debug/tracing

on post-fs-data
    mark_post_data

    mkdir /data/vendor 0771 root root
    mkdir /data/vendor_ce 0771 root root
    mkdir /data/vendor_de 0771 root root
    mkdir /data/vendor/hardware 0771 root root

    # For security reasons, /data/local/tmp should always be empty.
    # Do not place files or directories in /data/local/tmp
    mkdir /data/local 0751 root root
    mkdir /data/local/tmp 0771 shell shell

on post-fs-data && property:microdroid_manager.authfs.enabled=1
    start authfs_service

on boot
    # Mark boot completed. This will notify microdroid_manager to run payload.
    setprop dev.bootcomplete 1

service apexd-vm /system/bin/apexd --vm
    user root
    group system
    oneshot
    disabled
    capabilities CHOWN DAC_OVERRIDE DAC_READ_SEARCH FOWNER SYS_ADMIN

service ueventd /system/bin/ueventd
    user root
    group root
    class core
    critical
    seclabel u:r:ueventd:s0
    capabilities CHOWN DAC_OVERRIDE DAC_READ_SEARCH FOWNER FSETID MKNOD NET_ADMIN SETGID SETUID SYS_MODULE SYS_RAWIO SYS_ADMIN

service console /system/bin/sh
    class core
    console
    disabled
    user shell
    group shell log readproc
    seclabel u:r:shell:s0
    setenv HOSTNAME console

service init_debug_policy /system/bin/init_debug_policy
    user root
    oneshot
    disabled
    stdio_to_kmsg
