- 认证技术问题
- 键鼠模拟点击测试工具--xdotool
- Q:命令行修改屏幕分辨率
- KVM虚拟机-复制克隆(命令行)
- 统信UOS安装cherrytree
- 未进开发者根证书导入uos浏览器生效方案
- 将A卡驱动从从radeon切换为amdgpu
- uos系统ulimit工具使用
- kvm虚拟机运行时显示“启动域时出错”
- UOS文件命名最多支持字符数
- 在uos系统中如何下载不同架构的包
- 登录时输入正确密码后无法登陆 显示密码错误
- 通过终端判断窗口特效是否开启及开启关闭窗口特效
- 应用软件驻留任务栏问题
- FTP底层存储文件乱码
- 初识apache flink
- UOS专业版1032软件商店下载安装包缓存在哪里
- 如何用命令行查看当前cpu温度
- kvm远程连接报错ssh key
- 外设/认证类userid接口获取方式
- 命令行安装字体
- UOS访问windows文件共享
- uos系统中dbus调用api实现一些基本功能
- 用命令行设置关闭显示器、进入待机、自动锁屏
- 命令切换python版本
- uos系统中dbus调用实现系统锁屏
- UOS-lsmhookmanager程序的Demo
- KVM支持UEFI引导
- 身份鉴别系统如何接入UOS的PAM框架
- UOS收集桌面日志
- UOS远程windows桌面
- 获取有效打印机日志方法
- UOS浏览器导入证书
- 开发者问题反馈指南
- 因节信息为空,导致的签名失败的问题
- 搜狗输入法导入字体库
- LightDM桌面显示器相关技术内容(系统默认)
- 源码打包为deb
- 开源大数据部署手册
- UOS查看摄像头是否链接成功
- 安装双系统后无法进入UOS系统
- 进入桌面系统弹黑屏PoolCreationFaile解决办法
- udev详解
- dpkg: 处理软件包 uos-browser-stable
- 统信云打印
- uos-route路由相关操作
- 统信UOS操作系统-共享文件夹
- 统信UOS操作系统-定时关机
- 解决 tail 命令提示“inotify 资源耗尽,无法使用
- 使用字体管理器导入字体
- 清除浏览器dns缓存
- 在 Linux 中永久修改 USB 设备权限
- kvm 显示spice协议错误
- uos系统切换java版本
- rpm包在uos系统无法直接安装
- 更改密码后如何绕过登陆密钥环验证
- deb安装后,启动菜单没有启动图标
- 应用上架报错“获取不到包信息请检查”
- qt creator不能输入中文
- uname -v 第一个字段意义
- zabbix安装文档
- 统信服安装完系统后,切换root用户没有root用户密码
- uos系统中dbus调用实现特效模式开关
- UOS非开发者模式调用dmidecode
- 非适配完成打印机官方驱动安装方法
- apache spark 部署
- 使用MegaCli做raid
- 任务栏出现两个图标
- 通过 gdebi 工具解决安装本地包缺失依赖问题
- UOS通过Nginx托管Net Core服务
- 回收站删除时提示权限问题无法删除
- Linux 命令行查看图片详细信息(分辨率、色深、格式等)
- 切换JDK默认版本
- uos Postgresql 12.1 安装过程笔记
- PostgreSQL关系数据库
- kvm虚拟机运行时显示“启动域时出错”
- 统信UOS安装steam
- 如何查看uos浏览器是否支持flash
- uos系统中dbus调用api实现个性化透明度
- 如何确定deb包是否已经过统信方面的签名
- appimage打包基础步骤
- 命令行制作U盘启动盘方法
- vim配置优化
- 强制关机后磁盘数据损坏,initramfs无法挂载进不去系统
- 如何安装Debian&uos双系统
- 激活过程中提示服务器连接失败
- UOS浏览器内部协议(部分)
- uos设备管理器取值对照表
- 系统最小化安装,字符界面实现EAP认证
- dbus使用方法
- uos系统中dbus调用实现注销系统
- KVM虚拟机--删除(命令行)
- ppd文件打包deb
- uos和uos之间如何共享奔图打印机
- 驱动安装时提示"hplip-plugin"无法安装
- 离线环境先如何激活系统
- 基于UOS 部署微软.NET环境
- 外设驱动重新打包
- 关于打包过程dpkg-source -b . 命令构建出deb包时报错简单分析
- UOS更换英伟达官方显卡驱动
- 如何查看系统安装时间
- uos1030MIPS服务器安装kms激活
- uos远程连接工具--FinalShell的安装和使用
- 公网deb包转uos的deb包
- 开机引导后无法进入系统,显示busybox v1.30.
- 统信UOS命令行更改时间
- 在商店上架的应用显示程序大小异常
- 点击桌面上关机按钮,提示阻挡关机
- UOS浏览器下查看浏览器插件情况
- 打包规范之control文件字段说明
- UOS中输入法框架的开发技术是什么?
- uos右键刷新
- 开源堡垒机JumpServer解决方案
- UOS浏览器导入根证书
- 行业版环境如何实现远程适配?
- 修改系统默认语言编码
- 统信桌面操作系统查看当前版本
- 开源ZooKeeper集群解决方案
- lspci命令的应用
- 获取xxx软件包及依赖
- 开源ffmpeg的使用
- 用uos创建共享打印机
- deb安装,右键卸载失败的问题
- 系统历史启停时间查询脚本
- 串口使用及配置
- UOS切换至root用户命令无法补全问题
- .desktop文件Exec字段参数解释
- 自签名后因为系统时间变更导致程序无法运行
- 怎么使用iBMC工具安装uos操作系统
- activemq服务无法启动
- 二进制软件包打包为deb
- apt命令提示lock异常解决方案
- 应用软件打包辅助工具v1.0版本
- "提示:E: dpkg 被中断,您必须手工运行 ‘sudo
- 最小化环境命令行激活系统
- 如何拉取软件依赖包
- dpkg: 警告: 无法找到软件包 xxx 的文件名列表文件
- uos浏览器如何清除dns缓存
- 浏览器闪退解决方案
- 检查deb包打包规范脚本
- UOS自定义右键新建文档
- apache samza部署
- UOS 实现 rc.local 开机执行命令
- smb自动挂载
- UOS 搭建Firekyin个人网站
- 统信服务器操作系统设置登录时自动填充用户名
- 修改tomcat的最大连接数
- 单用户模式下创建一个可登录的用户
检查deb包打包规范脚本
该脚本可以迅速定位deb包商店打包规范常见问题,适用于验包时因为小细节,很久没有找到问题,以及包不能正常安装或有问题。 具体功能如下: 检查目录结构 检查control文件必要字段及参数 检查图标文件 检查info文件 检查desktop文件 检查钩子脚本
使用方式: 1、解压需要被检查的deb包 sudo dpkg-deb -R com.apps.build-rvms_1.0.0.0_amd64.deb rvms
2、执行脚本 ./scripts/check_deb_1.0.sh rvms
运行效果如下
脚本每项检查都会输出结果OK或FAIL,FAIL的会在下一行给出具体原因,帮助我们迅速定位问题。由于本人参与的app任务较少,所检查的项可能不是很全,大家可以根据自己平时遇到的问题,根据需求完善脚本。
脚本检查没问题不能保证包就100%合规,具体使用建议先用脚本扫一遍,在去手工检查下control及info文件,最后还是得安装运行卸载一遍。
脚本内容如下:
#!/bin/bash
BASE_DIR=$1
DEBIAN_DIR="$BASE_DIR/DEBIAN"
OPT_DIR="${BASE_DIR}/opt"
declare -a dir_list
PACKAGE_IS_NULL=""
PACKAGE=""
VERSION=""
ARCH=""
DESC=""
LINE_IS_NULL=""
# 判断参数数量
if [ $# -ne 1 ];then
echo "USAGE: $0 DIR"
exit 1
fi
# 判断目录
if [ ! -d $1 ];then
echo "$1 不是目录或者该目录不存在."
exit 2
fi
function fail(){
echo -e "$1 \t\t\t[\033[31mFAIL\033[0m]"
}
function ok(){
echo -e "$1 \t\t\t[\033[32mOK\033[0m]"
}
function scan_dir(){
echo "-----------------------目录检查开始-------------------------"
# 扫描目录
for i in `ls $BASE_DIR`;do
dir_list[${#dir_list[*]}]=$i
done
# 打印目录
dirs=""
for i in ${dir_list[*]};do
if [ $i == "DEBIAN" ];then
dirs=$dirs+$i
elif [ $i == "opt" ];then
dirs=$dirs+$i
else
dirs=$dirs+$i
echo -e "\033[31mInfo: 扫描到不合规目录$i,请检查是否必要。\033[0m"
fi
done
#echo "所有目录:$dirs" | tr '+' ' '
# 检查DEBIAN目录是否存在
if [ ! -d $DEBIAN_DIR ];then
fail "检查DEBIAN目录是否存在\t\t"
echo -e "ERROR: ${DEBIAN_DIR}目录不存在\n"
else
ok "检查DEBIAN目录是否存在\t\t"
fi
# 检查control文件是否存在
if [ ! -f ${DEBIAN_DIR}/control ];then
fail "检查control文件是否存在\t\t"
echo -e "ERROR: ${DEBIAN_DIR}/control文件不存在\n"
else
ok "检查control文件是否存在\t\t"
fi
# 检查是否有钩子脚本
script_num=`ls ${DEBIAN_DIR}/*rm ${DEBIAN_DIR}/*inst 2>/dev/null |wc -l`
if [ ${script_num} -gt 0 ];then
fail "检查是否有钩子脚本\t\t"
echo -e "Note: ${DEBIAN_DIR}/下有钩子脚本,请手动检查是否合规.\n"
else
ok "检查是否有钩子脚本\t\t"
fi
# 检查opt目录是否存在
if [ ! -d $OPT_DIR ];then
fail "检查opt目录是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}目录不存在\n"
else
ok "检查opt目录是否存在\t\t"
fi
# 检查opt/apps目录是否存在
if [ ! -d $OPT_DIR/apps ];then
fail "检查opt/apps目录是否存在\t"
echo -e "ERROR: ${OPT_DIR}/apps目录不存在\n"
else
ok "检查opt/apps目录是否存在\t"
fi
# 检查PACKAGE目录名是否正确
if [ ! -d ${OPT_DIR}/apps/${PACKAGE} ];then
fail "检查程序目录是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}目录不存在,可能与control文件中包名不一致,终止后续检查.\n"
exit 100
else
ok "检查程序目录是否存在\t\t"
fi
# 检查entries目录
if [ ! -d ${OPT_DIR}/apps/${PACKAGE}/entries ];then
fail "检查entries目录是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/entries目录不存在\n"
else
ok "检查entries目录是否存在\t\t"
fi
# 检查applications目录
if [ ! -d ${OPT_DIR}/apps/${PACKAGE}/entries/applications ];then
fail "检查applications目录是否存在\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/entries/applications目录不存在\n"
else
ok "检查applications目录是否存在\t"
fi
#检查desktop文件
if [ ! -f ${OPT_DIR}/apps/${PACKAGE}/entries/applications/${PACKAGE}.desktop ];then
fail "检查desktop文件是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/entries/applications/${PACKAGE}.desktop文件不存在\n"
else
ok "检查desktop文件是否存在\t\t"
fi
# 检查icons目录
if [ ! -d ${OPT_DIR}/apps/${PACKAGE}/entries/icons ];then
fail "检查icons目录是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/entries/icons目录不存在\n"
else
ok "检查icons目录是否存在\t\t"
fi
# 检查hicolor目录
if [ ! -d ${OPT_DIR}/apps/${PACKAGE}/entries/icons/hicolor ];then
fail "检查hicolor目录是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/entries/icons/hicolor目录不存在\n"
else
ok "检查hicolor目录是否存在\t\t"
fi
# 检查files目录
if [ ! -d ${OPT_DIR}/apps/${PACKAGE}/files ];then
fail "检查files目录是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/files目录不存在\n"
else
ok "检查files目录是否存在\t\t"
fi
#检查info文件
if [ ! -f ${OPT_DIR}/apps/${PACKAGE}/info ];then
fail "检查info文件是否存在\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/info文件不存在\n"
else
ok "检查info文件是否存在\t\t"
fi
echo -e "-----------------------目录检查结束-------------------------\n"
}
function check_icon_type(){
real_extent_name=`file $1 2>/dev/null| grep -E "SVG|JPEG|PNG" -o`
if [ ${real_extent_name} == "SVG" ];then
real_extent_name="svg"
elif [ ${real_extent_name} == "PNG" ];then
real_extent_name="png"
elif [ ${real_extent_name} == "JPEG" ];then
real_extent_name="jpg"
fi
if [ ${real_extent_name} == ${icon_type} ];then
ok "检查Icon字段\t\t\t"
else
fail "检查Icon字段\t\t\t"
echo -e "ERROR: $1文件扩展名为${icon_type},但实际文件类型为${real_extent_name},可能会影响图标显示.\n"
fi
}
function check_control(){
echo "-------------------control文件检查开始----------------------"
# 包名是否为空
PACKAGE_IS_NULL=`grep Package ${DEBIAN_DIR}/control | awk -F ": " '{print $2}'`
if [ -z $PACKAGE_IS_NULL ];then
fail "检查Package字段是否为空\t\t"
echo -e "ERROR: Package字段参数不能为空且:后必须有一个空格.\n"
else
ok "检查Package字段是否为空\t\t"
fi
# 包名是否是域名倒置
PACKAGE=`grep Package ${DEBIAN_DIR}/control | awk -F ": " '{print $2}' |grep -E "^(com|cn|edu|org|net|gov)(\.[a-Z0-9]+)+"`
if [ -z $PACKAGE ];then
fail "检查Package是否域名倒置\t\t"
echo -e "ERROR: Package字段参数必须是域名倒置.\n"
else
ok "检查Package是否域名倒置\t\t"
fi
# 版本
VERSION=`grep Version ${DEBIAN_DIR}/control | awk -F ": " '{print $2}'`
if [ -z $VERSION ];then
fail "检查Version字段\t\t\t"
echo -e "ERROR: Version字段不能为空且:后必须有一个空格.\n"
else
ok "检查Version字段\t\t\t"
fi
# 架构
ARCH=`grep Architecture ${DEBIAN_DIR}/control | awk -F ": " '{print $2}'`
if [ -z $ARCH ];then
fail "检查Architecture字段\t\t"
echo -e "ERROR: Architecture字段不能为空且:后必须有一个空格.\n"
else
if [ ${ARCH} != "amd64" -a ${ARCH} != "arm64" -a ${ARCH} != "mips64el" -a ${ARCH} != "sw_64" -a ${ARCH} != "all" -a ${ARCH} != "any" ];then
fail "检查Architecture字段\t\t"
echo -e "ERROR: Architecture字段只能{arm64|amd64|mips64el|sw_64|all|any}\n"
else
ok "检查Architecture字段\t\t"
fi
fi
# 描述
DESC=`grep Description ${DEBIAN_DIR}/control | awk -F ": " '{print $2}'`
if [ -z "$DESC" ];then
fail "检查Description字段\t\t"
echo -e "ERROR: Description字段不能为空且:后必须有一个空格.\n"
else
ok "检查Description字段\t\t"
fi
# 分类
SECTION=`grep Section ${DEBIAN_DIR}/control | awk -F ": " '{print $2}'`
if [ -z "$SECTION" ];then
fail "检查Section字段\t\t\t"
echo -e "ERROR: Section字段不能为空且:后必须有一个空格.\n"
else
ok "检查Section字段\t\t\t"
fi
# 是否有空行,1表示没有空行,0有空行
grep ^$ ${DEBIAN_DIR}/control 1>/dev/null 2>&1
LINE_IS_NULL=$?
if [ ! $LINE_IS_NULL -eq 1 ];then
fail "检查是否有空行\t\t\t"
echo -e "ERROE: control文件中不能有空行.\n"
else
ok "检查是否有空行\t\t\t"
fi
echo -e "-------------------control文件检查结束----------------------\n"
}
function check_desktop_file(){
echo -e "-------------------desktop文件检查开始----------------------"
# 检查Icon文件是否存在
icon_path=`grep Icon ${OPT_DIR}/apps/${PACKAGE}/entries/applications/${PACKAGE}.desktop 2>/dev/null|awk -F "=" '{print $2}'`
icon_is_full_path=`echo ${icon_path} | cut -c 1`
icon_type=`echo ${icon_path} |rev |cut -c 1-6 |rev | awk -F '.' '{print $2}'`
if [ -f ${OPT_DIR}/apps/${PACKAGE}/entries/applications/${PACKAGE}.desktop ];then
if [ ${icon_type} != "png" -a ${icon_type} != "svg" -a ${icon_type} != "jpg" ];then
fail "检查Icon文件类型\t\t"
echo -e "ERROR: Icon文件类型必须是jpg/png/svg,您desktop文件中可能没有扩展名。\n"
else
ok "检查Icon文件类型\t\t"
if [ -z $icon_path ];then
fail "检查Icon字段\t\t\t"
echo -e "ERROR: Icon字段不能为空且:后面要有一个空格.\n"
else
if [ ${icon_is_full_path} == '/' ];then
if [ ! -f ${BASE_DIR}${icon_path} ];then
fail "检查Icon字段\t\t\t"
echo -e "ERROR: ${BASE_DIR}${icon_path}文件不存在.\n"
else
check_icon_type ${BASE_DIR}${icon_path}
fi
else
image_dir="${OPT_DIR}/apps/${PACKAGE}/entries/icons/hicolor/"
if [ -f ${image_dir}16x16/apps/${icon_path} ];then
check_icon_type ${image_dir}16x16/apps/${icon_path}
elif [ -f ${image_dir}24x24/apps/${icon_path} ];then
check_icon_type ${image_dir}24x24/apps/${icon_path}
elif [ -f ${image_dir}32x32/apps/${icon_path} ];then
check_icon_type ${image_dir}32x32/apps/${icon_path}
elif [ -f ${image_dir}48x48/apps/${icon_path} ];then
check_icon_type ${image_dir}48x48/apps/${icon_path}
elif [ -f ${image_dir}128x128/apps/${icon_path} ];then
check_icon_type ${image_dir}128x128/apps/${icon_path}
elif [ -f ${image_dir}256x256/apps/${icon_path} ];then
check_icon_type ${image_dir}256x256/apps/${icon_path}
elif [ -f ${image_dir}512x512/apps/${icon_path} ];then
check_icon_type ${image_dir}512x512/apps/${icon_path}
elif [ -f ${image_dir}scalable/apps/${icon_path} ];then
check_icon_type ${image_dir}scalable/apps/${icon_path}
else
fail "检查Icon字段\t\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/entries/icons/hicolor/{scalable|16x16|32x32|48x48...512}/apps/${icon_path}文件不存在.\n"
fi
fi
fi
fi
# 检查Exec启动程序是否存在
exec_path=`grep Exec ${OPT_DIR}/apps/${PACKAGE}/entries/applications/${PACKAGE}.desktop 2>/dev/null |awk -F "=" '{print $2}' |awk '{print $1}'`
if [ ! -f ${BASE_DIR}${exec_path} ];then
fail "检查Exec字段\t\t\t"
echo -e "ERROR: ${BASE_DIR}${exec_path}文件不存在.\n"
else
ok "检查Exec字段\t\t\t"
fi
else
fail "检查Icon文件类型\t\t"
fail "检查Exec字段\t\t\t"
echo -e "ERROR: ${OPT_DIR}/apps/${PACKAGE}/entries/applications/${PACKAGE}.desktop文件不存在\n"
fi
echo -e "-------------------desktop文件检查结束----------------------\n"
}
function check_info_file(){
echo -e "---------------------info文件检查开始-----------------------"
appid=`grep appid ${OPT_DIR}/apps/${PACKAGE}/info 2>/dev/null|awk -F ":" '{print $2}' |tr -d "\"" |tr -d , | tr -d ' '`
arch_num=`grep arch ${OPT_DIR}/apps/${PACKAGE}/info 2>/dev/null |tr -d "[]" |awk -F ',' '{print (NF-1)}'`
arch=`grep arch ${OPT_DIR}/apps/${PACKAGE}/info 2>/dev/null`
# 检查appid字段
if [ -z $appid ];then
fail "检查appid字段\t\t\t"
echo -e "ERROR: appid字段不能为空.\n"
else
if [ ${PACKAGE} != `echo ${appid} |tr -d "$" |tr -d "\r"` ];then
fail "检查appid字段\t\t\t"
echo -e "ERROR: appid字段参数与Package字段参数不一致.\n"
else
ok "检查appid字段\t\t\t"
fi
fi
# 检查arch字段
if [ $arch_num -eq "1" ];then
if [ $ARCH == `echo $arch | awk -F ":" '{print $2}' | tr -d "[],\""` ];then
ok "检查arch字段\t\t\t"
else
fail "检查arch字段\t\t\t"
echo -e "ERROR: arch字段参数与control中不一致.\n"
fi
elif [ $arch_num -eq "2" ];then
fail "检查arch字段\t\t\t"
echo -e "ERROR: arch字段参数与control中不一致.\n"
elif [ $arch_num -eq "3" ];then
if [ $ARCH == "any" -o $ARCH == "all" ];then
echo $arch | grep "amd64" |grep "arm64" | grep "mips64el" -q
if [ $? -eq 0 ];then
ok "检查arch字段\t\t\t"
else
fail "检查arch字段\t\t\t"
echo -e "ERROR: arch字段参数与control中不一致.\n"
fi
else
fail "检查arch字段\t\t\t"
echo -e "ERROR: arch字段参数与control中不一致.\n"
fi
else
fail "检查arch字段\t\t\t"
echo -e "ERROR: arch字段参数太多或\n"
fi
# 检查json语法
tail -n 2 ${OPT_DIR}/apps/${PACKAGE}/info | grep -q ","
if [ $? -eq 0 ];then
fail "检查json语法\t\t\t"
echo -e "ERROR: info文件倒数第二行有多余的,号.\n"
else
ok "检查json语法\t\t\t"
fi
echo -e "---------------------info文件检查结束-----------------------\n"
}
check_control
scan_dir
check_desktop_file
check_info_file