#!/bin/bash

# Copyright (c) KylinSoft Co., Ltd. [2023].All rights reserved.

isexit(){
    grep -nR "$1" /etc/dynamicso |awk -F ":" '{print $1,$2}' >/tmp/match
    while read line
    do
        pathname=`echo "$line"| awk -F " " '{print $3}'`
        if [ "$pathname" = "$1" ];then
            num="1"
            break
        fi
    done </tmp/match
    echo "$num" 
}

matchnumber(){
grep -nR "$1" /etc/dynamicso |awk -F ":" '{print $1,$2}' >/tmp/match
while read line
do
    pathname=`echo "$line"| awk -F " " '{print $3}'`
    linenum=`echo "$line"| awk -F " " '{print $1}'`
    if [ "$pathname" == "$1" ];then
        num="$linenum"
        break
    fi
done </tmp/match
echo "$num"
}

case "$1" in
#checkmd5sum --check or checkmd5sum -c 
--check|-c)
    if [ $# -eq 1 ]; then
        count=`ps -ef |grep "checkdynamic.sh" | grep -v  "grep" |wc -l`
        if [ $count -eq 0 ]; then
            if [ -f /etc/dynamicso ]; then
                md5sum -c --quiet /etc/dynamicso
		echo "check 结束"
            fi
        fi
    else
        echo "--check或者-c后面不需要加任何参数"   
    fi;;

#checkmd5sum --add/-a
--add|-a)
    #checkmd5sum --add --path/-p  动态库绝对路径
    if [ $# -gt 1 ]; then
        if [ "$2" != "-p" -a  "$2" != "--path" ];then
            if [ "$2" != "-l" -a  "$2" != "--list" ];then
                echo "不支持这种命令格式，请在后面添加-p, --path, -l, --list"
                exit
            fi
        fi

        if [ "$2" == "-p" ] || [ "$2" == "--path" ];then
            if [ $# -gt 2 ];then
                while [ -n "$3" ]
                do 
                    if [ -f $3 ];then
                        exit=`isexit $3`
                        if [ "$exit" = "" ];then
                            md5sum $3 >>/etc/dynamicso
                            echo "增加$3到动态库数据库中"
                        else 
                            echo "动态库系统中已经存在$3"
                        fi
                    else
                        echo "系统中不存在$3动态库"
                    fi
                    shift
                done
            else
                echo "在-p或者--path后面添加动态库文件路径"
                exit
            fi
        fi
    
    #checkmd5sum --add --list/-l  包含动态库绝对路径的文件
        if [ "$2" == "-l" ] || [ "$2" == "--list" ];then
            if [ $# -gt 2 ];then
                while [ -n "$3" ]
                do 
                    while read line
                    do
                        if [ -f $line ];then
                            exit=`isexit $line`
                            if [ "$exit" = "" ];then
                                md5sum $line >>/etc/dynamicso
                                echo "增加$line到动态库数据库中"
                            else
                                echo "动态库系统中已经存在$line"
                            fi
                        else
                            echo "系统中不存在$line动态库"
                        fi
                    done <$3
                    shift
                done
            else
                echo "在-l或者--list后面添加包含动态库路径的文件"
                exit
            fi
        fi
    else
        echo "需要在--add或者-a后面添加动态库绝对路径或者包含动态库绝对路径的文件"
    fi
    #echo "成功在动态库数据库中增加动态库和动态库MD5值";;
    echo "";;

#checkmd5sum --modify/-m
--modify|-m)
    #checkmd5sum --modify --path/-p  动态库绝对路径
    if [ $# -gt 1 ];then
        if [ "$2" != "-p" -a  "$2" != "--path" ];then
            if [ "$2" != "-l" -a  "$2" != "--list" ];then
                echo "不支持这种命令格式，请在后面添加-p, --path, -l, --list"
                exit
            fi
        fi

        if [ "$2" == "-p" ] || [ "$2" == "--path" ];then
            if [ $# -gt 2 ];then
                while [ -n "$3" ]
                do 
                    linenum=`matchnumber $3`
                    if [ "X" != "X$linenum" ];then
		        linecontent=`sed -n "${linenum}p" /etc/dynamicso`
		        md5org=`echo $linecontent | awk -F ' ' '{print $1}'`
		        md5change=`md5sum $3 | awk -F ' ' '{print $1}'`
			if [ "$md5org" == "$md5change" ];then
				echo "$3 md5sum值未发生改变，不修改"
			else
                            sed -i "${linenum}d" /etc/dynamicso
                            if [ -f $3 ]; then
                                md5sum $3 >>/etc/dynamicso
                                echo "修改动态库中$3 md5sum值"
                            else
                                echo "系统中不存在$3动态库，因此删除动态库中这条记录"
                            fi
		        fi
                    else
                        if [ -f $3 ];then
                            md5sum $3 >>/etc/dynamicso
                            echo "动态数据库中不存在$3动态库，因此增加到动态库中"
                        else
                            echo "系统中不存在$3动态库"
                        fi
                    fi
                    shift
                done
            else
                echo "在-p或者--path后面添加动态库文件绝对路径"
                exit
            fi
        fi

        #checkmd5sum --modify --list/-l  包含动态库绝对路径的文件
        if [ "$2" == "-l" ] || [ "$2" == "--list" ];then
            if [ $# -gt 2 ];then
                while [ -n "$3" ]
                do 
                    while read line
                    do
                        linenum=`matchnumber $line`
                        if [ "X" != "X$linenum" ];then
		            linecontent=`sed -n "${linenum}p" /etc/dynamicso`
		            md5org=`echo $linecontent | awk -F ' ' '{print $1}'`
		            md5change=`md5sum $line | awk -F ' ' '{print $1}'`
			    if [ "$md5org" == "$md5change" ];then
				echo "$line md5sum值未发生改变，不修改"
			    else
                                sed -i "${linenum}d" /etc/dynamicso
                                if [ -f $line ] ;then
                                    md5sum $line >>/etc/dynamicso
                                    echo "修改动态库中$line md5sum值"
                                else
                                    echo "系统中不存在$line动态库，因此删除动态库中这条记录"
                                fi
		            fi
                        else
                            if [ -f $line ] ;then 
                                md5sum $line >>/etc/dynamicso
                                echo "动态数据库中不存在$line动态库，因此增加到动态库中"
                            else
                                echo "系统中不存在$line动态库"
                            fi
                        fi
                    done <$3
                    shift
                done
            else
                echo "在-l或者--list后面添加包含动态库路径的文件"
                exit
            fi
        fi
    else
        echo "需要在--delete或者-d后面添加动态库绝对路径或者包含动态库绝对路径的文件"
    fi
    #echo "成功修改动态库数据库中动态库和动态库的MD5值";;
    echo "";;

    
#checkmd5sum --delete/-d
--delete|-d)
    if [ $# -gt 1 ];then
        if [ "$2" != "-p" -a  "$2" != "--path" ];then
            if [ "$2" != "-l" -a  "$2" != "--list" ];then
                echo "不支持这种命令格式，请在后面添加-p, --path, -l, --list"
                exit
            fi
        fi

        if [ "$2" == "-p" ] || [ "$2" == "--path" ];then
            if [ $# -gt 2 ];then
                while [ -n "$3" ]
                do 
                    linenum=`matchnumber $3`
                    if [ "X" != "X$linenum" ];then
                        sed -i "${linenum}d" /etc/dynamicso
                        echo "$3在动态库中删除成功"
                    else
                        echo "动态库数据库中不存在$3动态库"
                    fi
                    shift
                done
            else
                echo "在-p或者--path后面添加动态库文件绝对路径"
                exit
            fi
        fi

        if [ "$2" == "-l" ] || [ "$2" == "--list" ];then
            if [ $# -gt 2 ];then
                while [ -n "$3" ]
                do 
                    while read line
                    do
                        linenum=`matchnumber $line`
                        if [ "X" != "X$linenum" ];then
                            sed -i "${linenum}d" /etc/dynamicso
                            echo "$line在动态库中删除成功"
                        else
                            echo "动态库数据库中不存在$line动态库"
                        fi
                    done <$3
                    shift
                done
            else
                echo "在-l或者--list后面添加包含动态库路径的文件"
            fi
        fi
    else
        echo "需要在--delete或者-d后面添加动态库绝对路径或者包含动态库绝对路径的文件"
        exit
    fi

    #echo "成功删除动态库数据库中动态库和动态库的MD5值";;
    echo "";;

--help|-h)
    if [ $# -eq 1 ]; then
        echo "      --help|-h 显示这个命令的用法"
        echo "      --check|-c 检测系统动态库MD5值是否修改及修改后的状态"
        echo "      --add|-a 增加动态库和动态库对应的MD5值到数据库中"
        echo "               --path|-p 在add命令后面添加动态库的绝对路径"
        echo "               --list|-l 在add命令后面添加包含动态库绝对路径的文件名"
        echo "      --modify|-m 在数据库中修改动态库的MD5值"
        echo "               --path|-p 在modify命令后面添加动态库的绝对路径"
        echo "               --list|-l 在modify命令后面添加包含动态库绝对路径的文件名"
        echo "      --delete|-d 在数据库中删除动态库和动态库对应的MD5值"
        echo "               --path|-p 在delete命令后面添加动态库的绝对路径"
        echo "               --list|-l 在delete命令后面添加包含动态库绝对路径的文件名"
    else
        echo "--help或者-h后面不需要加任何参数"   
    fi;;


*)
    echo "不支持这个命令，请查看帮助获得帮助"
esac
