123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932 |
- #!/bin/bash
- ## zramraid-maker
- ## (c) author's idea and realization: Kleemov A. & Koshuba V.
- ## script author: Koshuba V - stvixfree@gmail.com
- ## License: GPLv3
- ## all parameters
- option=$1;
- params=$2;
- PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/zramraid";
- version="03.02.21";
- ## msg [53]
- set_msg=( '"0" "1"' '"1" "1"' '"2" "1"' '"3" "1"' '"4" "1"' '"5" "1"' '"6" "1"' '"7" "1"' '"8" "1"'
- '"9" "1"' '"10" "1"' '"11" "1"' '"12" "1"' '"13" "1"' '"14" "1"' '"15" "1"' '"16" "1"'
- '"17" "1"' '"18" "1"' '"19" "1"' '"20" "1"' '"21" "1"' '"22" "1"' '"23" "1"' '"24" "1"'
- '"25" "1"' '"26" "1"' '"27" "1"' '"28" "1"' '"29" "1"' '"30" "1"' '"31" "1"' '"32" "1"'
- '"33" "1"' '"34" "0"' '"35" "0"' '"36" "0"' '"37" "0"' '"38" "0"' '"39" "0"' '"40" "0"'
- '"41" "0"' '"42" "1"' '"43" "1"' '"44" "1"' '"45" "0"' '"46" "1"' '"47" "1"' '"48" "1"'
- '"49" "1"' '"50" "1"' '"51" "1"' '"52" "1"' '"53" "1"' );
- msg=();
- ##
- lang=$(locale|grep LANG=|sed 's/\LANG=//g');
- rdate=$(date +%c);
- eval kernel_version="(" $(uname -r|sed 's/\./ /g'|awk '{print$1" "$2}') ")";
- test_module=$(find /lib/modules/$(uname -r) -name '*.ko'|grep zram|wc -m);
- ##
- total_mem=$(cat /proc/meminfo |awk '/^MemTotal:/{print $2}');
- free_mem=$(cat /proc/meminfo |awk '/^MemAvailable:/{print $2}');
- limit_mem=0;
- info_limit_mem=0;
- zpath="/etc/zramraid";
- zconfig="/etc/zramraid/zramraid.conf";
- zmsg="/etc/zramraid/messages.dat";
- log="/var/log/zramraid.log";
- ##
- reports=();
- id_zmd=();
- image_zmd=();
- size_zmd=();
- json_key=( "id" "image" );
- zdm_vars=( "id_zmd" "image_zmd" );
- input_unit=();
- math_unit=0;
- total_size_images=0;
- test_status=0;
- kernel_status=(); # [0]-kernel3x,[1]-kernel4x
- ##
- set_md_id="";
- set_zram_id="";
- set_md_status=(); # [0]-on\off,[1]-load zram,[2]-in config
- set_prepare=""; # 0 - new md, 1 - md assemble
- ##
- zr_blkid=$(whereis -b blkid|awk '/^blkid:/{print $2}');
- zr_jq=$(whereis -b jq|awk '/^jq:/{print $2}');
- zr_mdadm=$(whereis -b mdadm|awk '/^mdadm:/{print $2}');
- ## functions & operations
- operation_test=( "clear" "checkDep" "loadMsg" "testId" "checkModule" "confRead" "testMd" "testImage" "reportConf" "printInfo" );
- operation_on=( "checkDep" "loadMsg" "testId" "confRead" "checkModule" "testMd" "testImage" "statusZraid" "createZraid" );
- operation_sign_on=( "checkDep" "loadMsg" "testId" "confRead" "checkModule" "testImage" "inParams" "singleTestMd" "singleStart" );
- operation_sign_off=( "checkDep" "loadMsg" "testId" "confRead" "checkModule" "testImage" "inParams" "singleTestMd" "singleStop" );
- operation_off=( "checkDep" "loadMsg" "testId" "confRead" "checkModule" "offZraid" );
- operation_status=( "checkDep" "loadMsg" "testId" "confRead" "statusZraid" );
- operation_help=( "clear" "checkDep" "loadMsg" "printInfo" );
- execute_func=();
- ## logic executor values
- iFs=();
- logic=();
- value_in="";
- lEnd=1;
- ##--@F math functions
- ## Byte <> Kb
- function Byte(){ if [ ! ${input_unit[2]} ]
- then eval ${input_unit[1]}=$(echo "scale=0; ${input_unit[0]}/1024"|bc -lq);
- else eval ${input_unit[1]}=$(echo ${input_unit[0]}*1024|bc -lq);
- fi }
- ## Kb <> Byte
- function Kb() { if [ ! ${input_unit[2]} ]
- then eval ${input_unit[1]}=$(echo ${input_unit[0]}*1024|bc -lq);
- else eval ${input_unit[1]}=$(echo "scale=0; ${input_unit[0]}/1024"|bc -lq);
- fi }
- ## Mb <> Byte
- function Mb() { if [ ! ${input_unit[2]} ]
- then eval ${input_unit[1]}=$(echo ${input_unit[0]}*1024^2|bc -lq);
- else eval ${input_unit[1]}=$(echo "scale=0; ${input_unit[0]}/1024^2"|bc -lq);
- fi }
- ## Gb <> Byte
- function Gb() { if [ ! ${input_unit[2]} ]
- then eval ${input_unit[1]}=$(echo ${input_unit[0]}*1024^3|bc -lq);
- else eval ${input_unit[1]}=$(echo "scale=0; ${input_unit[0]}/1024^3"|bc -lq);
- fi }
- ## Tb <> Byte
- function Tb() { if [ ! ${input_unit[2]} ]
- then eval ${input_unit[1]}=$(echo ${input_unit[0]}*1024^4|bc -lq);
- else eval ${input_unit[1]}=$(echo "scale=0; ${input_unit[0]}/1024^4"|bc -lq);
- fi }
- ## -@F logic executor
- function eXlogic() {
- lEnd=1;
- if [[ ${#iFs[@]} -eq 0 ]]||[[ ${#iFs[@]} != ${#logic[@]} ]]
- then echo "exit";
- exit 0;
- fi
- local exfunc=();
- for ((lg_index=0; lg_index != ${#iFs[@]}; lg_index++))
- do
- ## !! debug operation...
- ##echo "eXlogic = execution: function ${iFs[$lg_index]} : index=$lg_index";
- local lg=$(echo $((${iFs[$lg_index]})) );
- local exfunc=( ${logic[$lg_index]} );
- local runfunc=$(echo ${exfunc[$lg]}| sed 's/\"//g');
- $runfunc;
- if [[ $lEnd == 0 ]]
- then lg_index=$((${#iFs[@]}-1));
- fi
- done
- iFs=();
- logic=();
- value_in="";
- }
- ##--@F write log events
- function writeToLog() {
- for ((rpt_index=0; rpt_index != ${#reports[@]}; rpt_index++))
- do
- echo "$rdate zramraid message: ${reports[$rpt_index]}">>$log;
- done
- }
- ##--@F make all errors
- function makeErr() {
- if [[ "$option" == "--on" ]]
- then
- if [ ! "$params" ]
- then
- reports[${#reports[@]}]="${msg[0]}";
- else
- reports[${#reports[@]}]=${msg[42]};
- fi
- else
- reports[${#reports[@]}]=${msg[42]};
- fi
- printInfo;
- writeToLog;
- exit 0;
- }
- function printInfo() {
- value_in="$option";
- iFs=( "$(echo -n $value_in|wc -m) == 0"
- "$(echo -n $value_in|sed 's/--help//g'|wc -m) == 0"
- "$(echo -n $value_in|sed 's/--test//g'|wc -m) == 0"
- "$(echo -n ${#reports[@]}) == 0" );
- logic=( '"" "pInone"'
- '"" "pIhelp"'
- '"" "pItest"'
- '"pIdf" "pInone"' );
- function pInone() {
- lEnd=0;
- ##clear
- echo
- echo -e ${msg[1]}"\n"${msg[2]}"\n"${msg[3]}"\n"${msg[4]}"\n"${msg[5]};
- echo -e ${msg[52]}"\n"${msg[53]};
- echo -e ${msg[31]}"\n"${msg[48]} $version;
- exit 0;
- }
- function pIhelp() {
- lEnd=0;
- ##clear
- echo
- echo -e ${msg[2]}"\n"${msg[3]}"\n"${msg[4]}"\n"${msg[5]};
- echo -e ${msg[51]}"\n"${msg[52]}
- echo -e ${msg[31]}"\n"${msg[48]} $version;
- exit 0;
- }
- function pItest() {
- lEnd=0;
- info_free_mem=0;
- info_total_mem=0;
- input_unit=( "$free_mem" "info_free_mem" "1" );
- Kb;
- input_unit=( "$total_mem" "info_total_mem" "1" );
- Kb;
- echo "==============================================================...";
- echo "${msg[32]} $info_total_mem""Mb ${msg[33]} $info_free_mem""Mb";
- echo "==============================================================...";
- for ((rpt_index=0; rpt_index != ${#reports[@]}; rpt_index++))
- do
- echo "${reports[$rpt_index]}";
- done
- echo "--------------------------------------------------------------...";
- exit 0;
- }
- ## default function last eXlogic..
- function pIdf() {
- for ((rpt_index=0; rpt_index != ${#reports[@]}; rpt_index++))
- do
- echo "${reports[$rpt_index]}";
- done
- }
- eXlogic;
- }
- ##--@F Check the program dependency
- function checkDep() {
- # This installation check $zr_jq
- if [ $(echo $zr_jq|grep jq|wc -m) = 0 ]
- then
- ## lang messages if yes then lang else us...
- reports[${#reports[@]}]=${msg[6]};
- makeErr
- fi
- # This installation check mdadm
- if [ $(echo $zr_mdadm|grep mdadm|wc -m) = 0 ]
- then
- reports[${#reports[@]}]=${msg[8]};
- makeErr
- fi
- if [ ! "$lang" ]
- then
- lang="C.UTF-8";
- fi
- }
- ##--@F read locale messages
- function loadMsg() {
- # test enable file messages
- if [ ! -f $zmsg ]
- then
- reports=();
- reports[${#reports[@]}]="$zmsg - file not found!";
- makeErr;
- fi
- # read msg
- if [[ ! $(cat $zmsg|grep "$lang"|wc -m) == 0 ]]
- then
- index_msg="$(cat $zmsg | jq '."'$lang'".msg[]'|wc -l)";
- if [[ ! "$index_msg" == "0" ]]||[[ "$index_msg" == "${#set_msg[@]}" ]]
- then
- for (( m_index=0; m_index != $index_msg; m_index++))
- do
- eval st_in_msg="(" ${set_msg[$m_index]} ")";
- if [ "${st_in_msg[1]}" != "0" ]
- then
- read_msg=$(cat $zmsg | jq '."'$lang'".msg['$m_index']'| sed 's/\"//g');
- msg[$m_index]="$read_msg";
- else
- msg[$m_index]="";
- fi
- done
- else
- reports=();
- reports[${#reports[@]}]="$zmsg - Incorrect file format or empty!";
- makeErr;
- fi
- fi
- }
- ##--@F check module zram & kernel version
- function checkModule() {
- # test kernel version
- iFs=( "${kernel_version[0]} < 3"
- "${kernel_version[0]} == 3"
- "${kernel_version[0]} == 4"
- "$test_module == 0" );
- logic=( '"" "notVersion"'
- '"" "kernel3"'
- '"" "kernel4"'
- '"" "zramFalse"' );
- function notVersion() {
- lEnd=0;
- reports[${#reports[@]}]="${msg[28]}";
- makeErr;
- }
- function kernel3() {
- kernel_status[${#kernel_status[@]}]="1";
- if (( "${kernel_version[1]}" < "14" ))
- then
- lEnd=0;
- reports[${#reports[@]}]="${msg[28]}";
- makeErr;
- fi
- }
- function kernel4() {
- kernel_status[${#kernel_status[@]}]="1";
- if (( "${kernel_version[1]}" > "2" ))
- then
- kernel_status[${#kernel_status[@]}]=1;
- fi
- }
- # test module zram
- function zramFalse() {
- lEnd=0;
- reports[${#reports[@]}]=${msg[27]};
- makeErr;
- }
- eXlogic;
- }
- ##--@F step operation
- function confRead() {
- # test enable file zramraid.conf
- if [ ! -f $zconfig ]
- then
- reports=();
- reports[${#reports[@]}]=${msg[7]};
- makeErr;
- fi
- # read config
- for (( rd_index=0; rd_index !=${#zdm_vars[@]}; rd_index++))
- do
- read_key=$(cat $zconfig | jq '.md[].'${json_key[$rd_index]}| sed 's/\"//g');
- eval ${zdm_vars[$rd_index]}="(" $read_key ")";
- done
- log=$(cat $zconfig | jq '.log'| sed 's/\"//g');
- ## test free memory
- value_mem=$(cat $zconfig | jq '.limit_free_mem.value_size'| sed 's/\"//g');
- value_in="$value_mem";
- iFs=( "$(echo -n $value_in|wc -m) == 0"
- "$(echo -n $value_in|sed 's/%//g'|wc -m) == 0"
- "$(echo -n $value_in|sed 's/Kb//g'|wc -m) == 0" );
- logic=( '"" "lmem_Err"'
- '"" "lmem_Per"'
- '"lmem_Err" "lmem_Kb"' );
- lmem_Err() {
- reports=();
- reports[${#reports[@]}]="${msg[29]} $value_mem /or null - ${msg[10]}(${msg[30]}:Kb,%)";
- makeErr;
- }
- lmem_Per() {
- lEnd=0;
- test_read_mem=0;
- input_unit=( "$free_mem" "test_read_mem" );
- Kb;
- math_unit=$(echo "scale=2; $(echo "scale=2; $test_read_mem/100"|bc -lq)*$(cat $zconfig | jq '.limit_free_mem.size'| sed 's/\"//g')"|bc -lq|sed 's/\./ /g'|awk '{print$1}');
- ## -"
- if (( "$math_unit" < 0 ))||[[ "$math_unit" == "" ]]||[[ ! "$math_unit" =~ ^([0-9]+)$ ]]
- then
- reports=();
- reports[${#reports[@]}]="${msg[29]} $value_mem /or null - ${msg[10]}(${msg[30]}:Kb,%)";
- makeErr;
- else
- limit_mem=$math_unit;
- input_unit=( "$math_unit" "info_limit_mem" );
- Byte;
- math_unit=$info_limit_mem;
- input_unit=( "$math_unit" "info_limit_mem" "1" );
- Kb;
- fi
- }
- lmem_Kb() {
- lEnd=0;
- input_unit=( "$(cat $zconfig | jq '.limit_free_mem.size'| sed 's/\"//g')" "math_unit" );
- Kb;
- limit_mem=$math_unit;
- input_unit=( "$math_unit" "info_limit_mem");
- Mb;
- }
- eXlogic;
- }
- ##--@F step operation
- function testMd() {
- # test the md number parameters for errors and busy in system
- if [ ${#id_zmd[@]} -eq 0 ]
- then reports[${#reports[@]}]="${msg[21]}${id_zmd[$md_index]} - ${msg[9]}";
- makeErr;
- fi
- for (( md_index=0; md_index != ${#id_zmd[@]}; md_index++))
- do
- if (( "${id_zmd[$md_index]}" < 0 ))||[[ "${id_zmd[$md_index]}" == "" ]]||[[ ! "${id_zmd[$md_index]}" =~ ^([0-9]+)$ ]]
- then reports[${#reports[@]}]="${msg[21]}${id_zmd[$md_index]} - ${msg[10]}";
- makeErr;
- fi
- ###
- if [ "$($zr_blkid /dev/md${id_zmd[$md_index]}|grep ${id_zmd[$md_index]})" ]
- then reports[${#reports[@]}]="${msg[21]}${id_zmd[$md_index]} - ${msg[11]}";
- makeErr;
- fi
- done
- # test the duble number md
- test_dub=( $(echo -e ${id_zmd[@]}|tr " " "\n"|sort|tr "\n" " ") );
- for (( dub_index=0; dub_index != ${#id_zmd[@]}; dub_index++ ))
- do
- dubtest_index=$(($dub_index+1));
- if [[ ! $dubtest_index > $((${#id_zmd[@]}-1)) ]]
- then
- if [[ $((${test_dub[dubtest_index]}-${test_dub[dub_index]})) == 0 ]];
- then reports[${#reports[@]}]="${msg[21]}${id_zmd[$dub_index]} - ${msg[12]}";
- makeErr;
- fi
- fi
- done
- ## ok test md*
- if [ "$option" == "--test" ]
- then
- reports[${#reports[@]}]=${msg[25]};
- fi
- }
- ##--@F step operation
- function testImage() {
- function test_true() {
- if [ "$option" == "--test" ]
- then
- reports[${#reports[@]}]=${msg[26]};
- fi
- }
- function test_null() {
- if [ "$option" == "--test" ]
- then
- reports[${#reports[@]}]=${msg[46]};
- fi
- }
- function sum_img() {
- ## the sum size images
- for (( image_index=0; image_index != ${#image_zmd[@]}; image_index++ ))
- do
- if [ ! -f ${image_zmd[$image_index]} ]
- then reports[${#reports[@]}]="${msg[22]}${image_zmd[$image_index]} - ${msg[13]}";
- makeErr
- fi
- size_zmd[$image_index]=$(stat -c%s ${image_zmd[$image_index]});
- done
- # test size image end size zram ...
- for (( im_index=0; im_index != ${#image_zmd[@]}; im_index++ ))
- do
- total_size_images=$(($total_size_images+${size_zmd[$im_index]}));
- done
- }
- function test_false() {
- reports=();
- reports[${#reports[@]}]="${msg[22]}$set_image - ${msg[14]}";
- makeErr;
- }
- iFs=( "$(echo -n ${#image_zmd[@]}) > 0" );
- logic=( '"test_null" "sum_img"' );
- eXlogic;
- iFs=( "$(echo -n $total_size_images) <= $limit_mem" );
- logic=( '"test_false" "test_true"' );
- eXlogic;
- }
- ##--@F step operation
- function reportConf() {
- if (( $total_size_images > 1024 ))
- then
- input_unit=( "$total_size_images" "math_unit" "1" );
- Kb;
- rep_size="$math_unit""Kb";
- else
- rep_size="$total_size_images""b";
- fi
- reports[${#reports[@]}]="size images: $rep_size";
- reports[${#reports[@]}]="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
- reports[${#reports[@]}]="${msg[20]} $info_limit_mem Mb";
- }
- ##--@F step operation
- function createZraid(){
- local check_start="0"
- if [ "$(lsmod |grep zram|wc -m)" == 0 ]
- then
- modprobe zram num_devices=${#id_zmd[@]};
- fi
- for ((crt_index=0; crt_index != ${#id_zmd[@]}; crt_index++))
- do
- set_md_id=${id_zmd[$crt_index]};
- singleTestMd;
- local tstart_md=$(echo ${set_md_status[@]}|tr -d ' '|sed 's/\"//g');
- if [[ "$tstart_md" == "" ]] || [[ ! "$tstart_md" =~ ^([0-9]+)$ ]] || (( "$tstart_md" < "0" ))
- then
- reports=();
- reports[${#reports[@]}]=${msg[10]};
- makeErr;
- fi
- if [[ "$tstart_md" == "001" ]]
- then
- check_start=$(echo $(($check_start+1)));
- zblock_dev=$((${size_zmd[$crt_index]}));
- echo $zblock_dev > /sys/block/zram$crt_index/disksize;
- on_loop=$(losetup -f "${image_zmd[$crt_index]}" && losetup -a |grep "${image_zmd[$crt_index]}"|awk '{print$1}'|sed 's/\://g');
- #
- set_image_name=${image_zmd[$crt_index]};
- prepareMd;
- #
- if [[ $set_prepare == "0" ]]
- then
- echo -e "y"|mdadm --create /dev/md${id_zmd[$crt_index]} --auto=yes --metadata=1.2 --level=raid1 --raid-devices=2 missing $on_loop;
- echo -e "y"|mdadm --add /dev/md${id_zmd[$crt_index]} /dev/zram$crt_index;
- else
- echo -e "y"|mdadm --create /dev/md${id_zmd[$crt_index]} --assume-clean --auto=yes --metadata=1.2 --level=raid1 --raid-devices=2 missing $on_loop;
- echo -e "y"|mdadm --add /dev/md${id_zmd[$crt_index]} /dev/zram$crt_index;
- fi
- fi
- done
- if (( "$check_start" >"0" ))
- then
- reports[${#reports[@]}]=${msg[16]};
- writeToLog;
- printInfo;
- else
- reports[${#reports[@]}]=${msg[50]};
- writeToLog;
- printInfo;
- fi
- }
- ##--@F step operation --------
- function offZraid(){
- local check_stop="0";
- for ((off_index=0; off_index != ${#id_zmd[@]}; off_index++))
- do
- set_md_id=${id_zmd[$off_index]};
- singleTestMd;
- local tstop_md=$(echo ${set_md_status[@]}|tr -d ' '|sed 's/\"//g');
- if [[ "$tstop_md" == "" ]] || [[ ! "$tstop_md" =~ ^([0-9]+)$ ]] || (( "$tstop_md" < "0" ))
- then
- reports=();
- reports[${#reports[@]}]=${msg[10]};
- makeErr;
- fi
- if [[ "$tstop_md" == "111" ]]||[[ "$tstop_md" == "101" ]]
- then
- check_stop=$(echo $(($check_stop+1)));
- local off_set_loop=$(losetup -a |grep "${image_zmd[$off_index]}"|awk '{print$1}'|sed 's/\://g');
- local off_set_zraid=$(cat /proc/mdstat |grep "md$set_md_id"|tail -n1|awk '{print$5}'|sed 's/\[2]//g');
- mdadm -S /dev/md$set_md_id;
- if [[ "$off_set_loop" ]]
- then
- losetup -d $off_set_loop;
- fi
- local kernel_type=$(echo ${kernel_status[@]}|tr -d ' '|sed 's/\:\"//g');
- if [ "$kernel_type" == "11" ]
- then
- if [ "$(lsmod|grep zram|wc -m)" != "0" ]
- then
- echo $(echo $off_set_zraid|sed 's/\dev//g'|sed 's/\zram//g'|sed 's/\///g') > /sys/class/zram-control/hot_remove ;
- fi
- fi
- fi
- done
- if [ $(lsmod|grep zram|wc -m) ]
- then modprobe -r zram;
- fi
- if (( "$check_stop" >"0" ))
- then
- reports[${#reports[@]}]=${msg[17]};
- writeToLog;
- printInfo;
- else
- reports[${#reports[@]}]=${msg[19]};
- writeToLog;
- printInfo;
- fi
- }
- ##--@F step operation
- function statusZraid(){
- status=();
- for ((st_index=0; st_index != ${#id_zmd[@]}; st_index++))
- do
- test_loop="$(cat /proc/mdstat |grep md${id_zmd[$st_index]}|awk '{print$6}'|cut -d'[' -f1)";
- if [ "$test_loop" ]
- then
- test_zmd="$(sudo losetup -a |grep $test_loop|awk '{print$3}'|grep ${image_zmd[$st_index]}|wc -m)";
- if [ "$test_zmd" ]
- then status[${#status[@]}]="md${id_zmd[$st_index]}";
- fi
- fi
- done
- if [ $test_status != 0 ]
- then
- test_status=0;
- if [ ! ${#status[@]} == 0 ]
- then
- reports[${#reports[@]}]="${msg[18]} ${status[@]}";
- writeToLog;
- printInfo;
- exit 0;
- else
- reports[${#reports[@]}]=${msg[19]};
- writeToLog;
- printInfo;
- exit 0;
- fi
- fi
- }
- ##--@F step operation
- function testId() {
- if (( ! $(id|grep "root"|wc -m) ))
- then
- reports=();
- reports[${#reports[@]}]="${msg[47]}";
- makeErr;
- fi
- }
- ##............................................................................................
- function singleStart() {
- local tset_md=$(echo ${set_md_status[@]}|tr -d ' '|sed 's/\"//g');
- if [[ "$tset_md" == "" ]] || [[ ! "$tset_md" =~ ^([0-9]+)$ ]] || (( "$tset_md" < "0" ))
- then
- reports=();
- reports[${#reports[@]}]=${msg[10]};
- makeErr;
- fi
- iFs=( "$tset_md == 001"
- "$tset_md == 111"
- "$tset_md == 100"
- "$tset_md == 000" );
- logic=( '"" "startSmd"'
- '"" "noStartSmd"'
- '"" "busSmd"'
- '"" "noConfSmd"' );
- function noStartSmd() {
- lEnd=0;
- reports=();
- reports[${#reports[@]}]="md$set_md_id${msg[50]}";
- printInfo;
- exit 0;
- }
- function busSmd() {
- lEnd=0;
- reports=();
- reports[${#reports[@]}]="md$set_md_id${msg[15]}";
- printInfo;
- exit 0;
- }
- function noConfSmd() {
- lEnd=0;
- reports=();
- reports[${#reports[@]}]="md$set_md_id : ${msg[9]}";
- printInfo;
- exit 0;
- }
- function startSmd () {
- lEnd=0;
- local on_set_image="$(cat $zconfig|jq -c '.md[]|select(.id == "'$set_md_id'")|.image'|sed 's/\"//g' )";
- local on_set_loop="$(losetup -f)";
- losetup "$on_set_loop" "$on_set_image";
- if (( $(lsmod|grep zram|wc -m) != 0 ))
- then
- cat /sys/class/zram-control/hot_add >/dev/nill ; ## add zram dev!
- else
- modprobe zram num_devices=1;
- fi
- local set_zram_id="$(echo $(($(ls /dev/zram*|sed 's/\dev//g'|sed 's/\zram//g'|sed 's/\///g'|tr -d '\r\n'|wc -c)-1)))";
- local zset_block_dev=$(stat -c%s "$on_set_image");
- echo $zset_block_dev > /sys/block/zram$set_zram_id/disksize;
- #
- set_image_name=$on_set_image;
- prepareMd;
- #
- if [[ $set_prepare == "0" ]]
- then
- echo -e "y"|mdadm --create /dev/md$set_md_id --auto=yes --metadata=1.2 --level=raid1 --raid-devices=2 missing $on_set_loop;
- echo -e "y"|mdadm --add /dev/md$set_md_id /dev/zram$set_zram_id;
- else
- echo -e "y"|mdadm --create /dev/md$set_md_id --assume-clean --auto=yes --metadata=1.2 --level=raid1 --raid-devices=2 missing $on_set_loop;
- echo -e "y"|mdadm --add /dev/md$set_md_id /dev/zram$set_zram_id;
- fi
- }
- eXlogic;
- reports[${#reports[@]}]="${msg[43]} : start - /dev/md$set_md_id";
- writeToLog;
- echo -e "${reports[@]}";
- }
- ##............................................................................................
- function singleStop() {
- local tset_md=$(echo ${set_md_status[@]}|tr -d ' '|sed 's/\"//g');
- if [[ "$tset_md" == "" ]] || [[ ! "$tset_md" =~ ^([0-9]+)$ ]] || (( "$tset_md" < "0" ))
- then
- reports=();
- reports[${#reports[@]}]=${msg[10]};
- makeErr;
- fi
- iFs=( "$tset_md == 001"
- "$tset_md == 111"
- "$tset_md == 101"
- "$tset_md == 100"
- "$tset_md == 000" );
- logic=( '"" "noStopSmd"'
- '"" "stopSmd"'
- '"" "stopSmd"'
- '"" "sBusSmd"'
- '"" "noConfSmd"' );
- function noStopSmd() {
- lEnd=0;
- reports=();
- reports[${#reports[@]}]="${msg[44]}md$set_md_id";
- reports[${#reports[@]}]="${msg[42]}";
- printInfo;
- exit 0;
- }
- function sBusSmd() {
- lEnd=0;
- reports=();
- reports[${#reports[@]}]="md$set_md_id${msg[15]}";
- printInfo;
- exit 0;
- }
- function noConfSmd() {
- lEnd=0;
- reports=();
- reports[${#reports[@]}]="md$set_md_id : ${msg[9]}";
- printInfo;
- exit 0;
- }
- function stopSmd () {
- lEnd=0;
- local off_set_loop="/dev/$(ls /sys/block/"md$set_md_id"/md/|grep loop|sed 's/dev-//g')";
- local off_set_zraid=$(cat /proc/mdstat |grep "md$set_md_id"|tail -n1|awk '{print$5}'|sed 's/\[2]//g');
- mdadm -S /dev/md$set_md_id;
- echo $(echo $off_set_zraid|sed 's/\dev//g'|sed 's/\zram//g'|sed 's/\///g') > /sys/class/zram-control/hot_remove;
- if [[ $off_set_loop ]]
- then
- losetup -d $off_set_loop;
- fi
- }
- eXlogic;
- reports[${#reports[@]}]="${msg[43]} : stop - /dev/md$set_md_id";
- writeToLog;
- echo -e "${reports[@]}";
- }
- ##...........................................................................................
- function singleTestMd() {
- local check_md=$(cat /proc/mdstat |grep "md$set_md_id"|tail -n 1|awk '{print$1}'|wc -m);
- local check_zram=$(cat /proc/mdstat |grep "md$set_md_id"|grep zram|wc -m);
- local check_conf=$(cat $zconfig|jq -c '.md[]."id"'|grep -e "$set_md_id"|sed 's/\"//g'|sed 's/^[ \t]*//;s/[ \t]*$//'|wc -m);
- iFs=( "$check_md == 0"
- "$check_conf == 0"
- "$check_zram == 0" );
- logic=( '"statusOn" "statusOff"' # test on MD
- '"mDconfOn" "mDconfOff"' # test MD in conf
- '"mDzramOn" "mDzramOff"' # test zram in MD
- );
- function statusOn() {
- set_md_status[0]="1";
- }
-
- function statusOff() {
- set_md_status[0]="0";
- }
- function mDzramOn() {
- set_md_status[1]="1";
- }
- function mDzramOff() {
- set_md_status[1]="0";
- }
-
- function mDconfOn() {
- set_md_status[2]="1";
- }
-
- function mDconfOff() {
- set_md_status[2]="0";
- }
- eXlogic;
- }
- ##..........................................................................................
- function prepareMd() {
- local check_loop=$(losetup -a |grep "$set_image_name"|awk '{print$1}'|sed 's/\/dev\/\|s//g;s/\://g');
- if (( $(cat /proc/mdstat |grep "$check_loop"|awk '{print$1}'|wc -m) != "0" ))
- then
- mdadm -S /dev/$(cat /proc/mdstat |grep "$check_loop"|awk '{print$1}');
- set_prepare="1";
- else
- set_prepare="0";
- fi
- }
- ##...........................................................................................
- function inParams() {
- local kernel_type=$(echo ${kernel_status[@]}|tr -d ' ');
- if (( "$kernel_type" != "11" ))
- then
- reports=();
- reports[${#reports[@]}]="${msg[49]}";
- makeErr;
- fi
- eval set_params="(" $(echo -e $params|sed 's/\md//g') ")";
- if (( "${#set_params[@]}" >= "1" ))
- then
- set_md_id="${set_params[0]}";
- if [[ "$set_md_id" == "" ]]||[[ ! "$set_md_id" =~ ^([0-9]+)$ ]]||(( "$set_md_id" <= "0" ))
- then
- reports=();
- reports[${#reports[@]}]="${msg[10]}";
- makeErr;
- fi
- else
- reports=();
- reports[${#reports[@]}]="${msg[10]}";
- makeErr;
- fi
- }
- ##--@F executor
- function executor() {
- if [[ ${#execute_func[@]} -eq 0 ]]
- then echo "exit";
- exit 0;
- fi
- for ((ex_index=0; ex_index != ${#execute_func[@]}; ex_index++))
- do
- ## !! debug operation...
- ##echo "execution: function ${execute_func[ex_index]}"
- ${execute_func[ex_index]};
- done
- }
- ##- Begin zramraid
- case "$option" in
- ## on zramraid
- "--on" | "--on" )
- if [ ! "$params" ]
- then
- execute_func=( ${operation_on[@]} );
- executor;
- else
- execute_func=( ${operation_sign_on[@]} );
- executor;
- fi
- exit 0;
- ;;
- ## off zramraid
- "--off" | "--off" )
- if [ ! "$params" ]
- then
- execute_func=( ${operation_off[@]} );
- executor;
- else
- execute_func=( ${operation_sign_off[@]} );
- executor;
- fi
- exit 0;
- ;;
- ## status zramraid
- "--status" | "--status" )
- test_status=1;
- execute_func=( ${operation_status[@]} );
- executor;
- exit 0;
- ;;
- ## test config
- "--test" | "--test" )
- execute_func=( ${operation_test[@]} );
- executor;
- exit 0;
- ;;
- ## help
- "--help" | "--help" )
- execute_func=( ${operation_help[@]} );
- executor;
- exit 0;
- ;;
- * )
- # selecting defaults.
- execute_func=( ${operation_help[@]} );
- executor;
- exit 1;
- ;;
- esac
|