Skip to content

Commit a416ad9

Browse files
committed
[add] : kernel.sh
1 parent 756a593 commit a416ad9

File tree

1 file changed

+163
-0
lines changed

1 file changed

+163
-0
lines changed

tools/kernel.sh

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
script_path="$( cd -P "$( dirname "$(readlink -f "$0")" )" && cd .. && pwd )"
6+
mode=""
7+
arch=""
8+
channel=""
9+
kernel=""
10+
11+
_help() {
12+
echo "usage ${0} [options] [command]"
13+
echo
14+
echo "Scripts that perform kernel-related processing "
15+
echo
16+
echo " General command:"
17+
echo " check [name] Determine if the kernel is available"
18+
echo " show Shows a list of available kernels"
19+
echo " get [name] Prints the specified kernel settings"
20+
echo " help This help message"
21+
echo
22+
echo " General options:"
23+
echo " -a | --arch [arch] Specify the architecture"
24+
echo " -c | --channel Specify the channel"
25+
echo " -h | --help This help message"
26+
}
27+
28+
# Usage: getclm <number>
29+
# 標準入力から値を受けとり、引数で指定された列を抽出します。
30+
getclm() {
31+
echo "$(cat -)" | cut -d " " -f "${1}"
32+
}
33+
34+
# Message functions
35+
msg_error() {
36+
"${script_path}/tools/msg.sh" -a "kernel.sh" error "${1}"
37+
}
38+
39+
gen_kernel_list() {
40+
if [[ -z "${arch}" ]]; then
41+
msg_error "No architecture specified."
42+
exit 1
43+
fi
44+
local _list _kernel
45+
if [[ -n "${channel}" ]] && [[ -f "${script_path}/channels/${channel}/kernel_list-${arch}" ]]; then
46+
_list="${script_path}/channels/${channel}/kernel_list-${arch}"
47+
else
48+
_list="${script_path}/system/kernel-${arch}"
49+
fi
50+
for _kernel in $(grep -h -v ^'#' ${_list} | getclm 1); do
51+
kernellist+=("${_kernel}")
52+
done
53+
}
54+
55+
check() {
56+
gen_kernel_list
57+
if [[ ! "${#}" = "1" ]]; then
58+
_help
59+
exit 1
60+
fi
61+
if [[ $(printf '%s\n' "${kernellist[@]}" | grep -qx "${1}"; echo -n ${?} ) -eq 0 ]]; then
62+
echo "correct"
63+
else
64+
echo "incorrect"
65+
fi
66+
}
67+
68+
show() {
69+
gen_kernel_list
70+
if (( "${#kernellist[*]}" > 0)); then
71+
echo "${kernellist[*]}"
72+
fi
73+
}
74+
75+
get() {
76+
gen_kernel_list
77+
if [[ ! "${#}" = "1" ]]; then
78+
_help
79+
exit 1
80+
fi
81+
82+
#-- カーネルを解析、設定 --#
83+
local _kernel_config_file _kernel_name_list _kernel_line _get_kernel_line _kernel_config_line
84+
85+
# 選択されたカーネルの設定が描かれた行番号を取得
86+
_kernel_config_file="${script_path}/system/kernel-${arch}"
87+
_kernel_name_list=($(cat "${_kernel_config_file}" | grep -h -v ^'#' | getclm 1))
88+
_get_kernel_line() {
89+
local _kernel _count=0
90+
for _kernel in ${_kernel_name_list[@]}; do
91+
_count=$(( _count + 1 ))
92+
if [[ "${_kernel}" = "${1}" ]]; then echo "${_count}"; return 0; fi
93+
done
94+
echo -n "failed"
95+
return 0
96+
}
97+
_kernel_line="$(_get_kernel_line "${1}")"
98+
99+
# 不正なカーネル名なら終了する
100+
if [[ "${_kernel_line}" = "failed" ]]; then
101+
msg_error "Invalid kernel ${1}"
102+
exit 1
103+
fi
104+
105+
# カーネル設定ファイルから該当の行を抽出
106+
_kernel_config_line=($(cat "${_kernel_config_file}" | grep -h -v ^'#' | grep -v ^$ | head -n "${_kernel_line}" | tail -n 1))
107+
108+
# 抽出された行に書かれた設定をそれぞれの変数に代入
109+
# ここで定義された変数のみがグローバル変数
110+
cat << EOF
111+
kernel="${_kernel_config_line[0]}"
112+
kernel_filename="${_kernel_config_line[1]}"
113+
kernel_mkinitcpio_profile="${_kernel_config_line[2]}"
114+
EOF
115+
}
116+
117+
# Parse options
118+
ARGUMENT="${@}"
119+
_opt_short="a:c:h"
120+
_opt_long="arch:,channel:,help"
121+
OPT=$(getopt -o ${_opt_short} -l ${_opt_long} -- ${ARGUMENT})
122+
[[ ${?} != 0 ]] && exit 1
123+
124+
eval set -- "${OPT}"
125+
unset OPT _opt_short _opt_long
126+
127+
while true; do
128+
case ${1} in
129+
-a | --arch)
130+
arch="${2}"
131+
shift 2
132+
;;
133+
-c | --channel)
134+
channel="${2}"
135+
shift 2
136+
;;
137+
-h | --help)
138+
_help
139+
exit 0
140+
;;
141+
--)
142+
shift 1
143+
break
144+
;;
145+
146+
esac
147+
done
148+
149+
if [[ -z "${1}" ]]; then
150+
_help
151+
exit 1
152+
else
153+
mode="${1}"
154+
shift 1
155+
fi
156+
157+
case "${mode}" in
158+
"check" ) check ${@} ;;
159+
"show" ) show ;;
160+
"get" ) get ${@} ;;
161+
"help" ) _help; exit 0 ;;
162+
* ) _help; exit 1 ;;
163+
esac

0 commit comments

Comments
 (0)