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