blob: 8bab96d308274577dd47a1b6eb893c12ca8524cb [file] [log] [blame]
#!/bin/bash
# Copyright (C) 2021 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Check that sysfs wakeup nodes are correctly labeled by the
# device's sepolicy.
wakeup_attr="u:object_r:sysfs_wakeup:s0"
wakeup_paths=()
unlabeled_paths=()
get_wakeup_paths() {
adb shell 'paths=()
wakeup_dir=/sys/class/wakeup
cd $wakeup_dir
for file in $wakeup_dir/*; do
paths+=( $(realpath $file) )
done
echo "${paths[@]}"'
}
has_wakeup_attr() { #path
local _path="$1"
adb shell "ls -dZ $_path | grep -q $wakeup_attr"
return $?
}
check_wakeup_dup() { # wakeup_path
ret=1
for path in "${unlabeled_paths[@]}"; do
if [ "$path" == "$1" ]; then
ret=0
break
fi
done
return $ret
}
get_unlabeled_wakeup_paths() {
for path in ${wakeup_paths[@]}; do
wakeup_path="$path"
has_wakeup_attr "$wakeup_path" && continue
# If there exists a common wakeup parent directory, label that instead
# of each wakeupN directory
dir_path="$(dirname $path)"
[ "$(basename $dir_path)" == "wakeup" ] && wakeup_path="$dir_path"
check_wakeup_dup $wakeup_path || unlabeled_paths+=( $wakeup_path )
done
}
print_missing_labels() {
nr_unlabeled="${#unlabeled_paths[@]}"
[ "$nr_unlabeled" == "0" ] && return 1
echo ""
echo "Unlabeled wakeup nodes found, your device is likely missing"
echo "device/oem specific selinux genfscon rules for suspend."
echo ""
echo "Please review and add the following generated rules to the"
echo "device specific genfs_contexts:"
echo ""
for path in ${unlabeled_paths[@]}; do
echo "genfscon sysfs ${path#/sys/} $wakeup_attr"
done
echo ""
return 0
}
fail() { #msg
echo $1
exit 1
}
pass() { #msg
echo $1
exit 0
}
# requirement added in T (33)
vendor_api_level="$(adb shell getprop ro.vendor.api_level 33)"
if [ "$vendor_api_level" -lt 33 ]; then
pass "Test skipped: vendor_api_level ($vendor_api_level) < min_api_level (33)"
fi
# Test unlabeled sysfs_wakeup nodes
wakeup_paths+=( $(get_wakeup_paths) )
get_unlabeled_wakeup_paths
print_missing_labels && fail "Missing sysfs_wakeup labels" \
|| pass "No missing sysfs_wakeup labels"