OSDN Git Service

[fix] : Fixed default path.
[alterlinux/alterlinux.git] / wizard.sh
1 #!/usr/bin/env bash
2
3 set -e
4
5 nobuild=false
6
7 while getopts 'xn' arg; do
8     case "${arg}" in
9         n) nobuild=true ;;
10         x) set -x ;;
11     esac
12 done
13
14
15 script_path="$(readlink -f ${0%/*})"
16
17
18 function check_files () {
19     if [[ ! -f "${script_path}/build.sh" ]]; then
20         echo "${script_path}/build.shが見つかりませんでした。" >&2
21         exit 1
22     fi
23     if [[ ! -f "${script_path}/keyring.sh" ]]; then
24         echo "${script_path}/keyring.shが見つかりませんでした。" >&2
25         exit 1
26     fi
27 }
28
29
30 function install_dependencies () {
31     local checkpkg
32     local dependence
33     local pkg
34
35     function checkpkg () {
36         if [[ $(pacman -Q "${1}" 2> /dev/null | awk '{print $1}') = "${1}" ]]; then
37             if [[ $(pacman -Q "${1}" 2> /dev/null | awk '{print $2}') = $(pacman -Sp --print-format '%v' "${1}") ]]; then
38                 echo -n "true"
39             else
40                 echo -n "false"
41             fi
42         else
43             echo -n "false"
44         fi
45     }
46
47     dependence=("git" "make" "arch-install-scripts" "squashfs-tools" "libisoburn" "dosfstools" "lynx" "archiso")
48
49     echo "依存関係を確認しています..."
50     for pkg in ${dependence[@]}; do
51         if [[ $(checkpkg ${pkg}) = false ]]; then
52             install=(${install[@]} ${pkg})
53         fi
54     done
55
56     if [[ -n "${install[@]}" ]]; then
57         sudo pacman -Sy
58         sudo pacman -S --needed ${install[@]}
59     fi
60             
61 }
62
63
64 function run_add_key_script () {
65     local yn
66     echo -n "AlterLinuxの鍵を追加しますか? (y/N) : "
67     read yn
68     case ${yn} in
69         y | Y | yes | Yes | YES ) sudo "${script_path}/keyring.sh" --alter-add   ;;
70         n | N | no  | No  | NO  ) return 0                              ;;
71         *                       ) run_add_key_script                    ;;
72     esac
73 }
74
75
76 function remove_dependencies () {
77     if [[ -n "${install[@]}" ]]; then
78         sudo pacman -Rsn ${install[@]}
79     fi
80 }
81
82
83 function enable_plymouth () {
84     local yn
85     echo -n "Plymouthを有効化しますか? (y/N) : "
86     read yn
87     case ${yn} in
88         y | Y | yes | Yes | YES ) plymouth=true   ;;
89         n | N | no  | No  | NO  ) plymouth=false  ;;
90         *                       ) enable_plymouth ;;
91     esac
92 }
93
94
95 function enable_japanese () {
96     local yn
97     echo -n "日本語を有効化しますか? (y/N) : "
98     read yn
99     case ${yn} in
100         y | Y | yes | Yes | YES ) japanese=true   ;;
101         n | N | no  | No  | NO  ) japanese=false  ;;
102         *                       ) enable_japanese ;;
103     esac
104 }
105
106
107 function select_comp_type () {
108     local yn
109     local details
110     local ask_comp_type
111     echo -n "圧縮方式を設定しますか? (y/N) : "
112     read yn
113     case ${yn} in
114         y | Y | yes | Yes | YES ) details=true               ;;
115         n | N | no  | No  | NO  ) details=false              ;;
116         *                       ) select_comp_type; return 0 ;;
117     esac
118
119     function ask_comp_type () {
120         echo "圧縮方式を以下の番号から選択してください "
121         echo
122         echo "1: gzip"
123         echo "2: lzma"
124         echo "3: lzo"
125         echo "4: lz4"
126         echo "5: xz"
127         echo "6: zstd"
128         echo -n ": "
129
130         read yn
131
132         case ${yn} in
133             1    ) comp_type="gzip" ;;
134             2    ) comp_type="lzma" ;;
135             3    ) comp_type="lzo"  ;;
136             4    ) comp_type="lz4"  ;;
137             5    ) comp_type="xz"   ;;
138             6    ) comp_type="zstd" ;;
139             gzip ) comp_type="gzip" ;;
140             lzma ) comp_type="lzma" ;;
141             lzo  ) comp_type="lzo"  ;;
142             lz4  ) comp_type="lz4"  ;;
143             xz   ) comp_type="xz"   ;;
144             zstd ) comp_type="zstd" ;;
145             *    ) ask_comp_type    ;;
146         esac
147     }
148
149     if [[ ${details} = true ]]; then
150         ask_comp_type
151     fi
152
153     return 0
154 }
155
156
157 function set_comp_option () {
158
159     # lzmaには詳細なオプションはありません。
160     if [[ ! ${comp_type} = "lzma" ]]; then
161         local yn
162         local details
163         echo -n "圧縮の詳細を設定しますか? (y/N) : "
164         read yn
165         case ${yn} in
166             y | Y | yes | Yes | YES ) details=true              ;;
167             n | N | no  | No  | NO  ) details=false             ;;
168             *                       ) set_comp_option; return 0 ;;
169         esac
170         if [[ ${details} = true ]]; then
171             :
172         else
173             return 0
174         fi
175
176         local gzip
177         local lzo
178         local lz4
179         local xz
180         local zstd
181         comp_option=""
182
183         function gzip () {
184             local comp_level
185             function comp_level () {
186                 local level
187                 echo -n "gzipの圧縮レベルを入力してください。 (1~22) : "
188                 read level
189                 if [[ ${level} -lt 23 && ${level} -ge 4 ]]; then
190                     comp_option="-Xcompression-level ${level}"
191                 else
192                     comp_level
193                 fi
194             }
195             local window_size
196             function window_size () {
197                 local window
198                 echo -n "gzipのウィンドウサイズを入力してください。 (1~15) : "
199                 read window
200                 if [[ ${window} -lt 16 && ${window} -ge 4 ]]; then
201                     comp_option="${comp_option} -Xwindow-size ${window}"
202                 else
203                     window_size
204                 fi
205             }
206
207         }
208
209         function lz4 () {
210             local yn
211             echo -n "高圧縮モードを有効化しますか? (y/N) : "
212             read yn
213             case ${yn} in
214                 y | Y | yes | Yes | YES ) comp_option="-Xhc" ;;
215                 n | N | no  | No  | NO  ) :                  ;;
216                 *                       ) lz4                ;;
217             esac
218         }
219
220         function zstd () {
221             local level
222             echo -n "zstdの圧縮レベルを入力してください。 (1~22) : "
223             read level
224             if [[ ${level} -lt 23 && ${level} -ge 4 ]]; then
225                 comp_option="-Xcompression-level ${level}"
226             else
227                 zstd
228             fi
229         }
230
231         function lzo () {
232             echo "現在lzoは詳細プションのウィザードがサポートされていません。" >&2
233         }
234
235         function xz () {
236             echo "現在xzは詳細プションのウィザードがサポートされていません。" >&2
237         }
238
239         case ${comp_type} in
240             gzip ) gzip ;;
241             zstd ) zstd ;;
242             lz4  ) lz4  ;;
243             lzo  ) lzo  ;;
244             xz   ) xz   ;;
245             *    ) :    ;;
246         esac
247     fi
248 }
249
250
251 function set_username () {
252     local details
253     local ask_comp_type
254     echo -n "デフォルトではないユーザー名を設定しますか? (y/N) : "
255     read yn
256     case ${yn} in
257         y | Y | yes | Yes | YES ) details=true           ;;
258         n | N | no  | No  | NO  ) details=false          ;;
259         *                       ) set_username; return 0 ;;
260     esac
261
262     function ask_username () {
263         echo -n "ユーザー名を入力してください : "
264         read username
265         if [[ -z ${username} ]]; then
266             ask_username
267         fi
268     }
269
270     if [[ ${details} = true ]]; then
271         ask_username
272     fi
273
274     return 0
275 }
276
277
278 function set_password () {
279     local details
280     local ask_comp_type
281     echo -n "デフォルトではないパスワードを設定しますか? (y/N) : "
282     read yn
283     case ${yn} in
284         y | Y | yes | Yes | YES ) details=true           ;;
285         n | N | no  | No  | NO  ) details=false          ;;
286         *                       ) set_password; return 0 ;;
287     esac
288
289     function ask_password () {
290         echo -n "パスワードを入力してください : "
291         read -s password
292         echo
293         echo -n "もう一度入力してください : "
294         read -s confirm
295         if [[ ! $password = $confirm ]]; then
296             echo
297             echo "同じパスワードが入力されませんでした。"
298             ask_password
299         elif [[ -z $password || -z $confirm ]]; then
300             echo
301             echo "パスワードを入力してください。"
302             ask_password
303         fi
304         echo
305         unset confirm
306     }
307
308     if [[ ${details} = true ]]; then
309         ask_password
310     fi
311
312     return 0
313 }
314
315
316 function select_kernel () {
317     set +e
318     local do_you_want_to_select_kernel
319
320     function do_you_want_to_select_kernel () {
321         set +e
322         local yn
323         echo -n "デフォルト(zen)以外のカーネルを使用しますか? (y/N) : "
324         read yn
325         case ${yn} in
326             y | Y | yes | Yes | YES ) return 0                               ;;
327             n | N | no  | No  | NO  ) return 1                               ;;
328             *                       ) do_you_want_to_select_kernel; return 0 ;;
329         esac
330
331     }
332
333     local what_kernel
334
335     function what_kernel () {
336         echo "使用するカーネルを以下の番号から選択してください "
337         echo
338         echo "1: linux"
339         echo "2: linux-lts"
340         echo "3: linux-zen"
341         echo "4: linux-ck"
342         echo "5: linux-rt"
343         echo "6: linux-rt-lts"
344         echo "7: linux-lqx"
345         echo "8: linux-xanmod"
346         echo "9: linux-xanmod-lts"
347         echo -n ": "
348
349         read yn
350
351         case ${yn} in
352             1                ) kernel="core"       ;;
353             2                ) kernel="lts"        ;;
354             3                ) kernel="zen"        ;;
355             4                ) kernel="ck"         ;;
356             5                ) kernel="rt"         ;;
357             6                ) kernel="rt-lts"     ;;
358             7                ) kernel="lqx"        ;;
359             8                ) kernel="xanmod"     ;;
360             9                ) kernel="xanmod-lts" ;;
361             linux            ) kernel="kernel"     ;;
362             linux-lts        ) kernel="lts"        ;;
363             linux-zen        ) kernel="zen"        ;;
364             linux-ck         ) kernel="ck"         ;;
365             linux-rt         ) kernel="rt"         ;;
366             linux-rt-lts     ) kernel="rt-lts"     ;;
367             linux-lqx        ) kernel="lqx"        ;;
368             linux-xanmod     ) kernel="xanmod"     ;;
369             linux-xanmod-lts ) kernel="xanmod-lts" ;;
370
371             core             ) kernel="core"       ;;
372             lts              ) kernel="lts"        ;;
373             zen              ) kernel="zen"        ;;
374             ck               ) kernel="ck"         ;;
375             rt               ) kernel="rt"         ;;
376             rt-lts           ) kernel="rt-lts"     ;;
377             lqx              ) kernel="lqx"        ;;
378             xanmod           ) kernel="xanmod"     ;;
379             xanmod-lts       ) kernel="xanmod-lts" ;;
380             *                ) what_kernel         ;;
381         esac
382     }
383
384     do_you_want_to_select_kernel
385     exit_code=$?
386     if [[ ${exit_code} = 0 ]]; then
387         what_kernel
388     fi
389     set -e
390 }
391
392
393 # チャンネルの指定
394 function select_channel () {
395     local ask_channel
396
397     echo -n "デフォルト(xfce)以外のチャンネルを使用しますか? (y/N) : "
398     read yn
399     case ${yn} in
400         y | Y | yes | Yes | YES ) details=true             ;;
401         n | N | no  | No  | NO  ) details=false            ;;
402         *                       ) select_channel; return 0 ;;
403     esac
404
405     function ask_channel () {
406         local yn
407
408         echo "チャンネルを以下の番号から選択してください "
409         echo
410         echo "1: xfce"
411         echo "2: plasma"
412         echo -n ": "
413
414         read yn
415
416         case ${yn} in
417             1        ) channel="xfce"   ;;
418             2        ) channel="plasma" ;;
419             xfce     ) channel="xfce"   ;;
420             plasma   ) channel="plasma" ;;
421             *        ) select_channel   ;;
422         esac
423     }
424
425     if [[ ${details} = true ]]; then
426         ask_channel
427     fi
428     return 0
429 }
430
431
432 # イメージファイルの作成先
433 function set_out_dir {
434     echo "イメージファイルの作成先を入力して下さい。"
435     echo "デフォルトは ${script_path}/out です。"
436     echo -n ": "
437     read out_dir
438     if [[ -z "${out_dir}" ]]; then
439         out_dir=out
440     else
441         if [[ ! -d "${out_dir}" ]]; then
442             echo "存在しているディレクトリを指定して下さい"
443             set_out_dir
444             return 0
445         elif [[ "${out_dir}" = / ]] || [[ "${out_dir}" = /home ]]; then
446             echo "そのディレクトリは使用できません。"
447             set_out_dir
448             return 0
449         elif [[ -n "$(ls ${out_dir})" ]]; then
450             echo "ディレクトリは空ではありません。"
451             set_out_dir
452             return 0
453         fi
454     fi
455 }
456
457
458 # 最終的なbuild.shのオプションを生成
459 function generate_argument () {
460     if [[ ${japanese} = true ]]; then
461         argument="${argument} -j"
462     fi
463     if [[ ${plymouth} = true ]]; then
464         argument="${argument} -b"
465     fi
466     if [[ -n ${comp_type} ]]; then
467         argument="${argument} -c ${comp_type}"
468     fi
469     if [[ -n ${kernel} ]]; then
470         argument="${argument} -k ${kernel}"
471     fi
472     if [[ -n "${username}" ]]; then
473         argument="${argument} -u '${username}'"
474     fi
475     if [[ -n ${password} ]]; then
476         argument="${argument} -p '${password}'"
477     fi
478     if [[ -n ${out_dir} ]]; then
479         argument="${argument} -o '${out_dir}'"
480     fi
481     argument="${argument} ${channel}"
482 }
483
484 # 上の質問の関数を実行
485 function ask () {
486     enable_japanese
487     enable_plymouth
488     select_kernel
489     select_comp_type
490     set_comp_option
491     set_username
492     set_password
493     select_channel
494     set_out_dir
495     lastcheck
496 }
497
498 # ビルド設定の確認
499 function lastcheck () {
500     echo "以下の設定でビルドを開始します。"
501     echo
502     [[ -n "${japanese}"    ]] && echo "           Japanese : ${japanese}"
503     [[ -n "${plymouth}"    ]] && echo "           Plymouth : ${plymouth}"
504     [[ -n "${kernel}"      ]] && echo "             kernel : ${kernel}"
505     [[ -n "${comp_type}"   ]] && echo " Compression method : ${comp_type}"
506     [[ -n "${comp_option}" ]] && echo "Compression options : ${comp_option}"
507     [[ -n "${username}"    ]] && echo "           Username : ${username}"
508     [[ -n "${password}"    ]] && echo "           Password : ${password}"
509     [[ -n "${channel}"     ]] && echo "            Channel : ${channel}"
510     echo
511     echo -n "この設定で続行します。よろしいですか? (y/N) : "
512     local yn
513     read yn
514     case ${yn} in
515         y | Y | yes | Yes | YES ) :         ;;
516         n | N | no  | No  | NO  ) ask       ;;
517         *                       ) lastcheck ;;
518     esac
519 }
520
521 function start_build () {
522     if [[ ${nobuild} = true ]]; then
523         echo "${argument}"
524     else
525         # build.shの引数を表示(デバッグ用)
526         # echo ${argument}
527         sudo ./build.sh ${argument}
528         sudo rm -rf work/
529     fi
530 }
531
532 # 関数を実行
533 check_files
534 install_dependencies
535 run_add_key_script
536 ask
537 generate_argument
538 start_build
539 remove_dependencies