1#!/bin/bash 2# 3# Copyright (C) 2021-2022 Intel Corporation. 4# SPDX-License-Identifier: BSD-3-Clause 5# 6# crashlogctl is part of acrn-hypervisor. 7# 8 9declare -a CRASHLOG_SERVICES=( 10 acrnprobe.service 11 usercrash.service 12) 13 14SCRIPT="$0" 15CRASHLOG_SHARE_DIR=/usr/share/acrn/crashlog 16CRASHLOG_SYSTEM_CONF=${CRASHLOG_SHARE_DIR}/40-watchdog.conf 17CRASHLOG_SYSCTL_CONF=${CRASHLOG_SHARE_DIR}/80-coredump.conf 18CRASHLOG_VAR_DIR=/var/log/crashlog 19CRASHLOG_CORE_BACKUP=${CRASHLOG_VAR_DIR}/default_core_pattern 20CORE_PATTERN_CONF="/proc/sys/kernel/core_pattern" 21 22exit_ok() { 23 echo "$1" > /dev/stderr 24 exit 0 25} 26 27exit_err() { 28 echo "$1" > /dev/stderr 29 exit 1 30} 31 32notice() { 33 echo "$1" > /dev/stderr 34} 35 36for_each_service() { 37 local action=$1 && shift 38 local -a array=($*) 39 for service in "${array[@]}"; do 40 systemctl $action $service 41 [ $? -ne 0 ] && notice "Failed to $action ${service}. Continuing..." 42 done 43} 44 45crashlog_enable() { 46 47 # backup the default core_pattern 48 if [ -f ${CRASHLOG_CORE_BACKUP} ] 49 then 50 notice "... ${CRASHLOG_CORE_BACKUP} already exist. Do not perform backup" 51 else 52 cat ${CORE_PATTERN_CONF} > ${CRASHLOG_CORE_BACKUP} 53 notice "... Backup core pattern to ${CRASHLOG_CORE_BACKUP}" 54 fi 55 56 # Copy watchdog and coredump conf files 57 mkdir -p /etc/systemd/system.conf.d 58 cp -v ${CRASHLOG_SYSTEM_CONF} /etc/systemd/system.conf.d 59 mkdir -p /etc/sysctl.d 60 cp -v ${CRASHLOG_SYSCTL_CONF} /etc/sysctl.d 61 62 # Enable chrashlog services 63 for_each_service "enable" ${CRASHLOG_SERVICES[@]} 64 65 exit_ok "*** Please reboot your system. ***" 66} 67 68crashlog_disable() { 69 # Disable chrashlog services 70 for_each_service "disable" ${CRASHLOG_SERVICES[@]} 71 72 rm -v /etc/sysctl.d/${CRASHLOG_SYSCTL_CONF##*/} 73 rm -v /etc/systemd/system.conf.d/${CRASHLOG_SYSTEM_CONF##*/} 74 75 rm -f ${CRASHLOG_CORE_BACKUP} 76 77 exit_ok "*** Please reboot your system. ***" 78} 79 80crashlog_is_active() { 81 # check only activation units 82 echo "acrnprobe :" $(systemctl is-active acrnprobe.service) 83 echo "usercrash :" $(systemctl is-active usercrash.service) 84} 85 86 87usage() { 88 format=' %-10s %s\n' 89 printf "\n" 90 printf "%s - Control actions for ACRN crashlog services\n" "$SCRIPT" 91 printf "\n" 92 printf "$format" "enable" "Enable the ACRN crashlog services" 93 printf "$format" "disable" "Disable the ACRN crashlog services" 94 printf "$format" "is-active" "Checks if ACRN crashlog is active" 95 printf "\n" 96 exit 2 97} 98 99if [ $# -ne 1 ]; then 100 usage 101fi 102 103if [ $EUID -ne 0 ]; then 104 exit_err "Must be root to run this command. Exiting..." 105fi 106 107SUBCOMMAND=$1 108 109case $SUBCOMMAND in 110 enable) 111 crashlog_enable ;; 112 disable) 113 crashlog_disable ;; 114 is-active) 115 crashlog_is_active ;; 116 --help | -h) 117 usage ;; 118 *) 119 notice "Unknown command passed to $SCRIPT" 120 usage ;; 121esac 122 123exit 0 124 125# vi: ts=8 sw=2 sts=2 et tw=80 126