Files
SIC/code/dataintolib/into_datelib.sh
2023-02-28 09:33:09 +08:00

586 lines
14 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
set -e
#镜像挂载目录
MOUNT="/mnt"
#当前镜像版本
ISO_ROCKY="*4.2* | *6.0.42* | *4.3*"
ISO_DEBIN="*6.0.60* | *6.0.80*"
ISO_REDHA="*6.0.77* | *6.0.76*"
#当前目录
NOWDIR=`pwd`
#安装包临时解压目录
PKGDIR="$NOWDIR/pkg"
#操作系统存储目录
ISODIR="$NOWDIR/iso"
#数据库位置
data_DIR="../datalib"
#数据库名
data_NAME="fileinfo.db"
data_SQL="fileinfo.sql"
data_ADD="$data_DIR/$data_NAME"
data_FILE="$data_DIR/$data_SQL"
#日志文件
file_LOG="$NOWDIR/filelog"
#当前已经安装的文件列表
file_NOW="$NOWDIR/now_pkglist"
#当前镜像中未录入的文件列表
file_NEW="$NOWDIR/new_pkglist"
#读取镜像issue文件
function data_intoissue(){
echo "获取镜像版本通过issue)"
case $1 in
rocky)
iso_issue=`cat /etc/issue | sed ':a;N;s/\n/ /g;ta'`
sqlite3 $data_ADD "update product set product_issue='$iso_issue' where product_id=$data_isoid;"
;;
debian)
#iso_base_files=`find $iso_mountname -name base-files*.deb`
#if [ -d $PKGDIR ]
#then
# rm -rf $PKGDIR
#fi
#PKGDIR=$PKGDIR
#echo "解压base-files_8+deb8u9-linx18_amd64.deb"
#mkdir -p $PKGDIR
#dpkg -X $iso_base_files $PKGDIR
iso_issue=`cat /etc/issue | sed ':a;N;s/\n/ /g;ta'`
sqlite3 $data_ADD "update product set product_issue=\"$iso_issue\" where product_id=$data_isoid;"
;;
redhat)
iso_issue=`cat /etc/issue | sed ':a;N;s/\n/ /g;ta'`
sqlite3 $data_ADD "update product set product_issue=\"$iso_issue\" where product_id=$data_isoid;"
;;
*)
;;
esac
}
function data_intofile(){
local data_file=$1
if [ ! -e $data_file ]
then
echo "文件不存在"
return 0
fi
if [ "$2" == "1" ]
then
local data_filepath=$1
local data_filelevel=1
else
local data_filepath=` echo $data_file | awk -F "$PKGDIR" '{ print $2 }' `
local data_filelevel=2
fi
if [ "$PKGDIR" == "$data_file" ]
then
echo "临时目录"
return 0
elif [ "$data_filepath" == "/usr" ] ||
[ "$data_filepath" == "/etc" ] ||
[ "$data_filepath" == "/bin" ] ||
[ "$data_filepath" == "/sbin" ] ||
[ "$data_filepath" == "/lib" ] ||
[ "$data_filepath" == "/lib64" ] ||
[ "$data_filepath" == "/var" ] ||
[ "$data_filepath" == "/opt" ] ||
[ "$data_filepath" == "/dev" ] ||
[ "$data_filepath" == "/proc" ] ||
[ "$data_filepath" == "/sys" ] ||
[ "$data_filepath" == "/opt" ] ||
[ "$data_filepath" == "/tmp" ] ||
[ "$data_filepath" == "/mnt" ] ||
[ "$data_filepath" == "/usr/share" ] ||
[ "$data_filepath" == "/usr/bin" ] ||
[ "$data_filepath" == "/usr/lib" ] ||
[ "$data_filepath" == "/usr/etc" ] ||
[ "$data_filepath" == "/usr/lib64" ] ||
[ "$data_filepath" == "/usr/share" ] ||
[ "$data_filepath" == "/usr/include" ] ||
[ "$data_filepath" == "/usr/local" ] ||
[ "$data_filepath" == "/." ]
then
echo "无用目录"
return 0
fi
local data_filename=$(basename $data_file)
local data_filepermis=$(stat -c %a $data_file)
local data_filetype=$(ls -lad $data_file)
local data_filetype=$(echo ${data_filetype:0:1})
local data_filegenus=$(stat -c %g $data_file)
local data_fileowner=$(stat -c %u $data_file)
local data_filesize=$(stat -c %s $data_file)
#发现默认未有文件设置该信息
if [[ $data_filetype == "b" ]] ||
[[ $data_filetype == "s" ]] ||
[[ $data_filetype == "-" ]]
then
local data_filemd5=$(md5sum $data_file | awk '{ print $1 }')
local data_filecap=$(getcap "$data_file")
local data_filemac=$(getfmac "$data_file")
local data_fileacl=$(getfacl --absolute-name "$data_file" 2>/dev/null)
elif [[ $data_filetype == "d" ]]
then
local data_filemd5=
local data_filecap=$(getcap "$data_file")
local data_filemac=$(getfmac "$data_file")
local data_fileacl=$(getfacl --absolute-name "$data_file" 2>/dev/null)
fi
#当文件为解压收集信息时cap、mac、acl信息会出现错误。
if [[ $data_filelevel == "2" ]]
then
local data_filecap=""
local data_filemac=""
local data_fileacl=""
fi
local data_fileid=$(expr `sqlite3 $data_ADD "select file_id from file order by file_id desc limit 1;"` + 1)
local data_pkgid=$(sqlite3 $data_ADD "select pkg_id from pkg where pkg_name='$pkg_name' and pkg_version='$pkg_version' ;")
echo -e " 当前产品:$product_iso \n \
当前文件:$data_file \n \
当前文件名:$data_filename \n \
当前文件绝对路径:$data_filepath \n \
当前临时文件目录:$PKGDIR \n \
当前安装包:$pkg_name \n \
文件id: $data_fileid \n \
文件类型:$data_filetype \n \
文件属主:$data_fileowner \n \
文件属组:$data_filegenus \n \
文件权限:$data_filepermis \n \
文件大小:$data_filesize \n \
文件md5: $data_filemd5 \n \
文件cap: $data_filecap \n \
文件acl: $data_fileacl \n \
文件mac: $data_filemac \n \
$1存入数据库" >> $file_LOG
if [ -z $data_pkgid ]
then
echo "文件未经过安装包"
else
echo "将文件$data_filepath输入数据库"
sqlite3 $data_ADD "insert into file values ($data_fileid,\"$data_filename\",$data_pkgid,\"$data_filepath\",\"$data_filemd5\",\"$data_filetype\",\"$data_fileowner\",\"$data_filegenus\",$data_filepermis,$data_filesize,\"$data_fileacl\",\"$data_filecap\",\"$data_filelevel\",\"$data_filemac\")"
fi
}
function data_intopkg(){
local data_pkg=$1
local data_pkgmd5=`md5sum $data_pkg | awk '{ print $1 }'`
#要判断pkg表是否有重复包
local pkg_md5=`sqlite3 $data_ADD "select pkg_md5 from pkg where pkg_md5 is '$data_pkgmd5'"`
if [ "$pkg_md5" != "$data_pkgmd5" ];
then
case $data_pkg in
*pkg.tar.gz)
local data_pkgname=`echo "$(basename $data_pkg .pkg.tar.gz)" |awk -F "#" '{print $1}'`
local data_pkgversion=`echo "$(basename $data_pkg .pkg.tar.gz)" |awk -F "#" '{print $2}'`
;;
*.deb)
local data_pkgname=`echo "$(basename $data_pkg .deb)" | awk -F "_" '{print $1}'`
local data_pkgversion=`echo "$(basename $data_pkg .deb)" | awk -F "_" '{print $2"_"$3}'`
;;
*.rpm)
local data_pkgversion=`echo "$(basename $data_pkg .rpm)" | awk -F "-" '{for(i=NF-1;i<NF+1;i++){printf("%s",$i);if(i!=NF)printf("-")} printf("\n") }'`
local data_pkgname=`echo "$(basename $data_pkg .rpm)" | awk -F "-" '{for(i=1;i<NF-1;i++){printf("%s",$i);if(i!=NF-2)printf("-")} printf("\n") }'`
;;
esac
local data_pkgid=$(expr `sqlite3 $data_ADD "select pkg_id from pkg order by pkg_id desc limit 1;"` + 1)
echo -e " 当前包:$data_pkg \n 安装包名:$data_pkgname \n 安装包版本:$data_pkgversion \n 安装包md5: $data_pkgmd5 \n 安装包id: $data_pkgid \n " >> $file_LOG
sqlite3 $data_ADD "insert into pkg values ($data_pkgid,'$data_pkgname','$data_pkgversion','$data_pkgmd5')"
#更新product_and_pkg表
echo "更新product_and_pkg表"
local data_papid=$(expr `sqlite3 $data_ADD "select pap_id from product_and_pkg order by pap_id desc limit 1;"` + 1)
sqlite3 $data_ADD "insert into product_and_pkg values ($data_papid,$data_isoid,$data_pkgid)"
echo "$data_pkgname $data_pkgversion" >> ./new
#如果为新的安装包则解压扫描包内文件
else
local pkg_id=`sqlite3 $data_ADD "select pkg_id from pkg where pkg_md5 is '$data_pkgmd5'"`
local iso_pkgid=`sqlite3 $data_ADD "select product_id from product_and_pkg where pkg_id = '$pkg_id' and product_id = '$data_isoid'"`
#判断是否有向product_and_pkg输入相同的信息
if [ "$data_isoid" == "$iso_pkgid" ];
then
echo "相同安装包id为$pkg_id">>$file_LOG
echo "data_isoid=$data_isoid iso_pkgid=$iso_pkgid 未入库">>$file_LOG
else
local data_papid=$(expr `sqlite3 $data_ADD "select pap_id from product_and_pkg order by pap_id desc limit 1;"` + 1)
sqlite3 $data_ADD "insert into product_and_pkg values ($data_papid,$data_isoid,$pkg_id)"
echo "相同安装包id为$pkg_id">>$file_LOG
echo "data_isoid=$data_isoid iso_pkgid=$iso_pkgid 入库">>$file_LOG
fi
fi
}
function data_intoiso(){
data_iso=$1
data_isomd5=`md5sum $data_iso | awk '{ print $1 }'`
data_isoname=`echo "$(basename $data_iso .iso)" | awk -F "-" '{print $1"-"$2}'`
data_isoversion=`echo "$(basename $data_iso .iso)" | awk -F "$data_isoname" '{print $2}'`
data_isoid=$(expr `sqlite3 $data_ADD "select product_id from product order by product_id desc limit 1;"` + 1)
#获取最后一个id值加1
echo -e "当前镜像:$data_iso\n 镜像名:$data_isoname\n 镜像版本:$data_isoversion\n 镜像md5:$data_isomd5\n 镜像id:$data_isoid\n">>$file_LOG
sqlite3 $data_ADD "insert into product values ($data_isoid,'$data_isoname','$data_isoversion','$data_isomd5',' ')"
}
#整理文件信息获取
function data_get(){
data_stat=$2
echo "入库类型:$data_stat"
case $data_stat in
iso_stat)
data_intoiso $1
;;
pkg_stat)
data_intopkg $1
;;
file_stat)
data_intofile $1 $3
;;
iso_issue)
data_intoissue $1
;;
*)
echo "程序出错"
return 3
;;
esac
}
#将镜像挂载到指定目录下
function iso_mount(){
echo "iso_mount"
iso_mountname=$MOUNT
while [[ `mount | grep $iso_mountname` != "" ]]
do
umount $iso_mountname
done
if [ -d $iso_mountname ];
then
mount -o loop $iso_name $iso_mountname
else
mkdir $iso_mountname
mount -o loop $iso_name $iso_mountname
fi
data_get $iso_vis "iso_issue"
#将镜像issue信息存入库
}
#判断当前镜像版本
#将镜像信息入库
function iso(){
iso_name=$1
case $iso_name in
*4.2* | *6.0.42* | *4.3*)
echo "42"
iso_vis="rocky"
;;
*6.0.60* | *6.0.80* )
echo "60|80"
iso_vis="debian"
;;
*6.0.77* | *6.0.76* )
echo "76|77"
iso_vis="redhat"
;;
*)
echo "镜像不存在"
exit
;;
esac
data_get $product_iso "iso_stat"
#将镜像信息入库
}
#获取当前系统已经安装的安装包,并将镜像中全部安装包进行排序
function pkg(){
echo "tar:$1"
pkg_filename=$1
PKGDIR=$PKGDIR
case $iso_vis in
#当前已经安装的文件
rocky)
pkginfo -i | sort >> $file_NOW
;;
debian)
awk 'BEGIN{i=0;j=0;k=0}{if($1 == "Package:"){A[i]=$2;i+=1};if($1 == "Version:"){B[j]=$2;j+=1}if($1 == "Architecture:"){C[k]=$2;k=k+1}}END{for(i=0;i<k;i++)printf "%s %s_%s\n",A[i],B[i],C[i]}' /var/lib/dpkg/status | sort >> $file_NOW
;;
redhat)
rpm -qa | awk -F "-" '{for(i=1;i<NF-1;i++){printf("%s",$i);if(i!=NF-2)printf("-");};print " "$(NF-1)"-"$NF}' | sort >> $file_NOW
;;
*)
echo "解压选择出错$pkg_filename"
;;
esac
if [ -e ./new ]
then
cat ./new | sort >> $file_NEW
rm ./new
else
touch $file_NEW
fi
}
#获取需要收集安装包的文件信息
function file_now(){
#处理带有空格的文件名
MY_SAVEIFS=$IFS
IFS=$'\n'
#收集虚拟机已经安装的文件
for pkg_list in `comm -12 $file_NEW $file_NOW `
do
pkg_name=`echo $pkg_list | awk '{print $1}' `
pkg_version=`echo $pkg_list | awk '{print $2}'`
case $iso_vis in
rocky)
file_listname=$( pkginfo -l $pkg_name | sed "s/\*/\\\*/g" )
#发现有的文件存在*号,会导致文件信息获取出错。
for file_list in $file_listname
do
if [ -d "/$file_list" ];then
file_list=${file_list%?}
fi
data_get "/$file_list" "file_stat" 1
done
;;
debian)
for file_list in `dpkg -L $pkg_name | awk -F "" '{if($1=="软件包将其他的包转移至"){print $2}else{print $1}}'`
do
data_get $file_list "file_stat" 1
done
echo "当前已安装的包收集完毕"
;;
redhat)
for file_list in `rpm -ql $pkg_name`
do
data_get $file_list "file_stat" 1
done
;;
*)
echo "文件收集错误"
;;
esac
done
IFS=$MY_SAVEIFS 
}
function file_new(){
comm -23 $file_NEW $file_NOW |while read pkg_list
do
pkg_name=`echo $pkg_list | awk '{print $1}'`
pkg_version=`echo $pkg_list | awk '{print $2}'`
if [ -d $PKGDIR ]
then
rm -r $PKGDIR
fi
PKGDIR=$PKGDIR
case $iso_vis in
rocky)
pkg_filename=`echo $pkg_name"#"$pkg_version"*"`
pkg_filename=`find $iso_mountname -name $pkg_filename`
pkg_filename=`echo $pkg_filename | awk '{print $1}'`
echo "解压tar类型安装包"
mkdir -p $PKGDIR
tar xf $pkg_filename -C $PKGDIR
;;
debian)
pkg_filename=`echo $pkg_name"_"$pkg_version"*"`
pkg_filename=`find $iso_mountname -name $pkg_filename`
pkg_filename=`echo $pkg_filename | awk '{print $1}'`
echo "解压deb类型安装包"
mkdir -p $PKGDIR
dpkg -X $pkg_filename $PKGDIR
;;
redhat)
pkg_filename=`echo $pkg_name"-"$pkg_version"*"`
echo $iso_mountname
pkg_filename=`find $iso_mountname -name $pkg_filename`
pkg_filename=`echo $pkg_filename | awk '{print $1}'`
echo "解压rpm类型安装包"
mkdir -p $PKGDIR
cp $pkg_filename $PKGDIR
cd $PKGDIR
rpm2cpio *.rpm | cpio -div
rm *.rpm
cd -
;;
*)
echo "解压选择出错$pkg_filename"
;;
esac
#处理带有空格的文件名
MY_SAVEIFS=$IFS
IFS=$'\n'
for pkg_file in `find $PKGDIR`
do
data_get $pkg_file "file_stat" 2
done
IFS=$MY_SAVEIFS
rm -r $PKGDIR
done
}
#判断输入介质为目录
#输入目录名
function iso_pkg(){
echo "dir:$1"
iso_pkgdir=$1
case $iso_vis in
rocky)
echo "pkg.tar.gz安装包"
for iso_pkgfile in `find $iso_pkgdir -name *.pkg.tar.gz`
do
data_get $iso_pkgfile "pkg_stat"
done
;;
debian)
echo "deb安装包"
for iso_pkgfile in `find $iso_pkgdir -name *.deb`
do
data_get $iso_pkgfile "pkg_stat"
done
;;
redhat)
echo "rpm安装包"
for iso_pkgfile in `find $iso_pkgdir -name *.rpm`
do
data_get $iso_pkgfile "pkg_stat"
done
esac
}
function set_env(){
if [ -f $data_ADD ];
then
rm $data_ADD
fi
if [ -f $file_NEW ];
then
rm $file_NEW
fi
if [ -f $file_NOW ];
then
rm $file_NOW
fi
if [ -f $file_LOG ];
then
rm $file_LOG
fi
if [ -f ./new ];
then
rm ./new
fi
cd $data_DIR
sqlite3 $data_NAME < $data_FILE
cd -
echo "重建数据库"
#创建数据库
}
function main(){
echo " 请选择产品类型"
echo "========================================="
echo " 1.操作系统 2.附加产品 3.其他"
read product_stat
case ${product_stat:0:1} in
1)
set_env
#设置数据库
product_iso=`find $ISODIR -mindepth 1`
iso $product_iso
#判断镜像版本
iso_mount $iso_vis
#将镜像挂载在指定目录
iso_pkg $iso_mountname
#将镜像中未录入的安装包入库,并记录到$file_NEW
pkg $data_pkg
#获取当前已安装的安装包列表,并记录到$file_NOW
file_now
#获取已安装的包文件信息
file_new
#获取未安装的包文件信息
;;
2)
echo "附加产品"
;;
3)
echo "其它产品"
;;
*)
echo "请输入1/2/3"
esac
echo "信息录取成功"
}
main