From c2e191c8bd07fb6f7d0ab1233d40d89b38c60ed0 Mon Sep 17 00:00:00 2001
From: lujinlin <694419720@qq.com>
Date: Tue, 17 Dec 2024 18:07:41 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E9=A6=96=E6=AC=A1=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
lsy-loader/build.sh | 5 +
lsy-loader/install.sh | 11 +
lsy-loader/lsyloader/DEBIAN/control | 8 +
lsy-loader/lsyloader/DEBIAN/postinst | 11 +
lsy-loader/lsyloader/DEBIAN/postrm | 9 +
lsy-loader/lsyloader/DEBIAN/prerm | 10 +
lsy-loader/lsyloader/data/lsyloader/lsydeb.sh | 259 ++++++++++++++++++
.../lsyloader/data/lsyloader/lsyloader.sh | 7 +
lsy-loader/lsyloader/data/lsyloader/test.sh | 10 +
.../lsyloader/data/lsyloader/uninstall.sh | 20 ++
.../lsyloader/data/lsyloader/version.ini | 13 +
.../lib/systemd/system/lsyloader.service | 12 +
lsy-loader/lsyloader1.0.0.deb | Bin 0 -> 4072 bytes
lsy-loader/lsyloader1.0.0.debSign | 1 +
lsy-loader/lsyloader1.0.1.deb | Bin 0 -> 4072 bytes
lsy-loader/lsyloader1.0.1.debSign | 1 +
lsy-loader/readme.md | 6 +
lsy-loader/showVersion.sh | 2 +
lsy-loader/uninstallAll.sh | 21 ++
lsy-update/build.sh | 5 +
lsy-update/install.sh | 11 +
lsy-update/lsy_update-bak.sh | 217 +++++++++++++++
lsy-update/lsyupdate/DEBIAN/control | 8 +
lsy-update/lsyupdate/DEBIAN/postinst | 11 +
lsy-update/lsyupdate/DEBIAN/postrm | 9 +
lsy-update/lsyupdate/DEBIAN/prerm | 10 +
lsy-update/lsyupdate/data/lsyupdate/lsydeb.sh | 259 ++++++++++++++++++
.../lsyupdate/data/lsyupdate/lsyupdate.sh | 7 +
.../lsyupdate/data/lsyupdate/uninstall.sh | 20 ++
.../lib/systemd/system/lsyupdate.service | 12 +
lsy-update/lsyupdate1.0.0.deb | Bin 0 -> 3762 bytes
lsy-update/lsyupdate1.0.0.debSign | 1 +
lsy-update/lsyupdate1.0.1.deb | Bin 0 -> 3762 bytes
lsy-update/lsyupdate1.0.1.debSign | 1 +
lsy-update/showVersion.sh | 2 +
lsy-update/uninstallAll.sh | 21 ++
readme.md | 24 ++
37 files changed, 1024 insertions(+)
create mode 100755 lsy-loader/build.sh
create mode 100755 lsy-loader/install.sh
create mode 100644 lsy-loader/lsyloader/DEBIAN/control
create mode 100755 lsy-loader/lsyloader/DEBIAN/postinst
create mode 100755 lsy-loader/lsyloader/DEBIAN/postrm
create mode 100755 lsy-loader/lsyloader/DEBIAN/prerm
create mode 100755 lsy-loader/lsyloader/data/lsyloader/lsydeb.sh
create mode 100755 lsy-loader/lsyloader/data/lsyloader/lsyloader.sh
create mode 100755 lsy-loader/lsyloader/data/lsyloader/test.sh
create mode 100755 lsy-loader/lsyloader/data/lsyloader/uninstall.sh
create mode 100644 lsy-loader/lsyloader/data/lsyloader/version.ini
create mode 100644 lsy-loader/lsyloader/lib/systemd/system/lsyloader.service
create mode 100755 lsy-loader/lsyloader1.0.0.deb
create mode 100644 lsy-loader/lsyloader1.0.0.debSign
create mode 100755 lsy-loader/lsyloader1.0.1.deb
create mode 100644 lsy-loader/lsyloader1.0.1.debSign
create mode 100644 lsy-loader/readme.md
create mode 100755 lsy-loader/showVersion.sh
create mode 100755 lsy-loader/uninstallAll.sh
create mode 100755 lsy-update/build.sh
create mode 100755 lsy-update/install.sh
create mode 100755 lsy-update/lsy_update-bak.sh
create mode 100644 lsy-update/lsyupdate/DEBIAN/control
create mode 100755 lsy-update/lsyupdate/DEBIAN/postinst
create mode 100755 lsy-update/lsyupdate/DEBIAN/postrm
create mode 100755 lsy-update/lsyupdate/DEBIAN/prerm
create mode 100755 lsy-update/lsyupdate/data/lsyupdate/lsydeb.sh
create mode 100755 lsy-update/lsyupdate/data/lsyupdate/lsyupdate.sh
create mode 100755 lsy-update/lsyupdate/data/lsyupdate/uninstall.sh
create mode 100644 lsy-update/lsyupdate/lib/systemd/system/lsyupdate.service
create mode 100755 lsy-update/lsyupdate1.0.0.deb
create mode 100644 lsy-update/lsyupdate1.0.0.debSign
create mode 100755 lsy-update/lsyupdate1.0.1.deb
create mode 100644 lsy-update/lsyupdate1.0.1.debSign
create mode 100755 lsy-update/showVersion.sh
create mode 100755 lsy-update/uninstallAll.sh
create mode 100644 readme.md
diff --git a/lsy-loader/build.sh b/lsy-loader/build.sh
new file mode 100755
index 0000000..3548546
--- /dev/null
+++ b/lsy-loader/build.sh
@@ -0,0 +1,5 @@
+dpkg-deb --build lsyloader
+ver=$(dpkg-deb --show lsyloader.deb|awk '{print $2}')
+echo `sha256sum lsyloader.deb` >> "lsyloader$ver.debSign"
+mv lsyloader.deb lsyloader$ver.deb
+chmod 777 *.deb
\ No newline at end of file
diff --git a/lsy-loader/install.sh b/lsy-loader/install.sh
new file mode 100755
index 0000000..b9696a8
--- /dev/null
+++ b/lsy-loader/install.sh
@@ -0,0 +1,11 @@
+
+cur_dir=$(dirname "$(realpath "$0")")
+
+# sudo dpkg -i lsyloader1.0.0.deb
+
+cp *.deb /tmp/
+
+# deb必须放在/tmp这种有自由权限的目录
+# apt会自动处理依赖关系
+sudo apt install -y --allow-downgrades "/tmp/lsyloader1.0.0.deb"
+
diff --git a/lsy-loader/lsyloader/DEBIAN/control b/lsy-loader/lsyloader/DEBIAN/control
new file mode 100644
index 0000000..71c91a3
--- /dev/null
+++ b/lsy-loader/lsyloader/DEBIAN/control
@@ -0,0 +1,8 @@
+Package: lsyloader
+Version: 1.0.1
+Section: utils
+Priority: optional
+Architecture: amd64
+Maintainer: lsy@mail.com
+Depends: systemd (>= 240), libc6 (>= 2.28)
+Description: lsy udpate.
diff --git a/lsy-loader/lsyloader/DEBIAN/postinst b/lsy-loader/lsyloader/DEBIAN/postinst
new file mode 100755
index 0000000..43aa9b3
--- /dev/null
+++ b/lsy-loader/lsyloader/DEBIAN/postinst
@@ -0,0 +1,11 @@
+#!/bin/bash
+#set -e
+
+# Reload systemd configurations
+systemctl daemon-reload
+
+# Enable the service to start on boot
+systemctl enable lsyloader.service
+
+# Start the service
+systemctl start lsyloader.service
diff --git a/lsy-loader/lsyloader/DEBIAN/postrm b/lsy-loader/lsyloader/DEBIAN/postrm
new file mode 100755
index 0000000..5969671
--- /dev/null
+++ b/lsy-loader/lsyloader/DEBIAN/postrm
@@ -0,0 +1,9 @@
+#!/bin/bash
+#set -e
+
+
+systemctl disable lsyloader.service >/dev/null 2>&1 || true
+rm -f /lib/systemd/system/lsyloader.service
+rm -f /data/lsyloader/lsyloader.log
+systemctl daemon-reload
+
diff --git a/lsy-loader/lsyloader/DEBIAN/prerm b/lsy-loader/lsyloader/DEBIAN/prerm
new file mode 100755
index 0000000..bb8da09
--- /dev/null
+++ b/lsy-loader/lsyloader/DEBIAN/prerm
@@ -0,0 +1,10 @@
+#!/bin/bash
+#set -e
+
+# Stop the service if running
+if systemctl is-active --quiet lsyloader.service; then
+ systemctl stop lsyloader.service
+fi
+
+# Disable the service
+systemctl disable lsyloader.service
diff --git a/lsy-loader/lsyloader/data/lsyloader/lsydeb.sh b/lsy-loader/lsyloader/data/lsyloader/lsydeb.sh
new file mode 100755
index 0000000..13bf027
--- /dev/null
+++ b/lsy-loader/lsyloader/data/lsyloader/lsydeb.sh
@@ -0,0 +1,259 @@
+#!/bin/bash
+
+jsonIn=""
+#### jsonIn=version接口
+# {
+# "version": "1.0.5",
+# "name": "lsyloader",
+# "path": "http://192.168.200.128:5212/versionFile?filename=lsyloader1.0.5.deb",
+# "sign": "a0d47ccb8edaa029e2c1262a8351674846e4c055c798ad63c55851fa5dff7059"
+# }
+cur_dir=$(dirname "$(realpath "$0")")
+mkdir -p "/tmp/log"
+
+logFile="/tmp/log/lsyloader.log"
+maxLogSize=$((1024*1024*3))
+versionLocal="1.0.0"
+url="https://deb.jxm.cool/deb/version.ini"
+
+
+# 只处理
+pkgNameArrOnly=("lsyupdate")
+# 除了这些都处理,一般是自己, pkgNameArrOnly存在时,pkgNameArrExcept无效
+pkgNameArrExcept=("lsyloader")
+
+
+pkgName=""
+pkgUrl=""
+pkgVersion=""
+pkgSign=""
+outPath="$cur_dir/out.deb"
+
+function initLog() {
+ [ ! -e "$logFile" ] && return
+ local size=`ls -al "$logFile" |awk '{print $5}'`
+ echo $size
+ [ $size -gt $maxLogSize ] && rm -rf "$logFile"
+}
+
+function freshNow() {
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+}
+
+function get_json_value() {
+ awk -v json="$1" -v key="$2" -v defaultValue="$3" 'BEGIN{
+ foundKeyCount = 0
+ while (length(json) > 0) {
+ # pos = index(json, "\""key"\""); ## 这行更快一些,但是如果有value是字符串,且刚好与要查找的key相同,会被误认为是key而导致值获取错误
+ pos = match(json, "\""key"\"[ \\t]*?:[ \\t]*");
+ if (pos == 0) {if (foundKeyCount == 0) {print defaultValue;} exit 0;}
+
+ ++foundKeyCount;
+ start = 0; stop = 0; layer = 0;
+ for (i = pos + length(key) + 1; i <= length(json); ++i) {
+ lastChar = substr(json, i - 1, 1)
+ currChar = substr(json, i, 1)
+
+ if (start <= 0) {
+ if (lastChar == ":") {
+ start = currChar == " " ? i + 1: i;
+ if (currChar == "{" || currChar == "[") {
+ layer = 1;
+ }
+ }
+ } else {
+ if (currChar == "{" || currChar == "[") {
+ ++layer;
+ }
+ if (currChar == "}" || currChar == "]") {
+ --layer;
+ }
+ if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) {
+ stop = currChar == "," ? i : i + 1 + layer;
+ break;
+ }
+ }
+ }
+
+ if (start <= 0 || stop <= 0 || start > length(json) || stop > length(json) || start >= stop) {
+ if (foundKeyCount == 0) {print defaultValue;} exit 0;
+ } else {
+ print substr(json, start, stop - start);
+ }
+
+ json = substr(json, stop + 1, length(json) - stop)
+ }
+ }'
+}
+
+# split_str "${tmp_data}" "|"
+split_str_return_list=()
+function split_str() {
+ local str_data=$1
+ local str_pattern=$2
+
+ str=$str_data
+ delimiter=$str_pattern
+
+ array=()
+ while [ "$str" ]; do
+ substring="${str%%"$delimiter"*}"
+ [ -z "$substring" ] && str="${str#"$delimiter"}" && continue
+ array+=( "$substring" )
+ str="${str:${#substring}}"
+ [ "$str" == "$delimiter" ] && break
+ done
+ #declare -p array
+
+ split_str_return_list=()
+ for var in "${array[@]}"; do
+ #echo "[v]=${var}"
+ split_str_return_list+=( "${var}" )
+ done
+}
+
+function trimL() {
+ local str=$1
+ local toTrim=$2
+ local dst=${str#$toTrim}
+ echo $dst
+}
+function trimR() {
+ local str=$1
+ local toTrim=$2
+ local dst=${str%$toTrim}
+ echo $dst
+}
+function trim() {
+ local str=$1
+ local toTrim=$2
+ str=${str#$toTrim}
+ local dst=${str%$toTrim}
+ echo $dst
+}
+
+function hasVersion() {
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] hasVersion start" >> $logFile
+
+ local str_ack=$jsonIn
+
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] hasVersion done,$str_ack" >> $logFile
+
+ pkgUrl=$(get_json_value "$str_ack" "path" "")
+ pkgVersion=$(get_json_value "$str_ack" "version" "-1")
+ pkgSign=$(get_json_value "$str_ack" "sign" "")
+ pkgName=$(get_json_value "$str_ack" "name" "")
+
+ pkgUrl=$(trim "$pkgUrl" "\"")
+ pkgSign=$(trim "$pkgSign" "\"")
+ pkgName=$(trim "$pkgName" "\"")
+ [ -z "$pkgName" ] && echo "pkgName is empty skip" >> $logFile && return 0
+ # pkgNameArrOnly
+ local found=false
+ for item in "${pkgNameArrOnly[@]}"; do
+ if [[ "$item" == "$pkgName" ]]; then
+ found=true
+ break
+ fi
+ done
+ [ ${#pkgNameArrOnly[@]} -ne 0 ] && [ "$found" == false ] && echo "pkgName not in $pkgNameArrOnly skip" >> $logFile && return 0
+
+ # pkgNameArrExcept
+ for item in "${pkgNameArrExcept[@]}"; do
+ if [[ "$item" == "$pkgName" ]]; then
+ echo "pkgName in $pkgNameArrExcept skip" >> $logFile && return 0
+ fi
+ done
+
+ versionLocal=$(apt show "$pkgName"|grep "Version:"|head -n 1|awk '{print $2}')
+ [ "$versionLocal" == "" ] && versionLocal="1.0.0"
+ outPath="$cur_dir/$pkgName.deb"
+
+
+ version=$(trim "$pkgVersion" "\"")
+ split_str "${version}" "."
+ len=${#split_str_return_list[@]}
+ if [ $len -lt 3 ];then
+ return 0
+ fi
+ local v1=${split_str_return_list[0]}
+ local v2=${split_str_return_list[1]}
+ local v3=${split_str_return_list[2]}
+
+ split_str "${versionLocal}" "."
+ local lv1=${split_str_return_list[0]}
+ local lv2=${split_str_return_list[1]}
+ local lv3=${split_str_return_list[2]}
+
+ echo "[$nowtime] pkgVersion=$pkgVersion" >> $logFile
+ echo "[$nowtime] pkgUrl=$pkgUrl" >> $logFile
+ echo "[$nowtime] pkgSign=$pkgSign" >> $logFile
+ echo "[$nowtime] pkgName=$pkgName" >> $logFile
+
+ [ -z "$pkgUrl" ] && echo "[$nowtime] pkgurl empty skip" >> $logFile && return 0
+ [ -z "$pkgSign" ] && echo "[$nowtime] pkgSign empty skip" >> $logFile && return 0
+
+ echo "[$nowtime] v=$v1.$v2.$v3" >> $logFile
+ echo "[$nowtime] lv=$lv1.$lv2.$lv3" >> $logFile
+
+ [ "$v1" -gt "$lv1" ] && return 1
+ [ "$v2" -gt "$lv2" ] && return 1
+ [ "$v3" -gt "$lv3" ] && return 1
+
+ return 0
+}
+
+function runInstall() {
+
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] start..." >> $logFile
+
+ hasVersion
+ local bUpdate=$?
+ if [ $bUpdate -eq 0 ]; then
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] no need to update" >> $logFile
+ return
+ fi
+ echo "[$nowtime] need update" >> $logFile
+
+ freshNow
+ rm -rf "$outPath"
+ str_ack=`wget -O "$outPath" $pkgUrl`
+ [ ! -e "$outPath" ] && echo "[$nowtime] $outPath not exist" >> $logFile && return
+
+ freshNow
+ local fileSign=`sha256sum "$outPath"|awk '{print $1}'`
+ echo "[$nowtime] get sign,fileSign=$fileSign,$outPath" >> $logFile
+
+ [ "$fileSign" != "$pkgSign" ] && echo "[$nowtime] $fileSign!=$pkgSign,$outPath skip" >> $logFile && return
+
+ chmod +x "$outPath"
+ echo "[$nowtime] start uninstall $outPath" >> $logFile
+ bash $cur_dir/uninstall.sh "$pkgName" >> $logFile
+ echo "[$nowtime] start install $outPath" >> $logFile
+ apt install -y --allow-downgrades "$outPath" >> $logFile
+
+ freshNow
+ echo "[$nowtime] finish" >> $logFile
+}
+
+function main() {
+ initLog
+ str_ack=$(
+ curl --request GET \
+ --url "$url" \
+ --header 'content-type: application/json' \
+ --data ""
+ )
+ apps=($(echo "$str_ack" | jq -c '.[]'))
+ for item in "${apps[@]}"; do
+ jsonIn=$item
+ runInstall
+ sleep 2
+ done
+}
+main
+
diff --git a/lsy-loader/lsyloader/data/lsyloader/lsyloader.sh b/lsy-loader/lsyloader/data/lsyloader/lsyloader.sh
new file mode 100755
index 0000000..8ffce8d
--- /dev/null
+++ b/lsy-loader/lsyloader/data/lsyloader/lsyloader.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+cur_dir=$(dirname "$(realpath "$0")")
+while true; do
+ bash "$cur_dir/lsydeb.sh"
+ sleep 20
+done
diff --git a/lsy-loader/lsyloader/data/lsyloader/test.sh b/lsy-loader/lsyloader/data/lsyloader/test.sh
new file mode 100755
index 0000000..56afa49
--- /dev/null
+++ b/lsy-loader/lsyloader/data/lsyloader/test.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+json_data=$(cat "/home/lyn/work/deb-pkg/lsy-loader/lsyloader/data/lsyloader/version.ini")
+apps=($(echo "$json_data" | jq -c '.[]'))
+
+# 输出每个元素
+for item in "${apps[@]}"; do
+ echo "apps: $item"
+done
+
diff --git a/lsy-loader/lsyloader/data/lsyloader/uninstall.sh b/lsy-loader/lsyloader/data/lsyloader/uninstall.sh
new file mode 100755
index 0000000..4642301
--- /dev/null
+++ b/lsy-loader/lsyloader/data/lsyloader/uninstall.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# "$appname"
+appname=$1
+
+[ -z "$appname" ] && echo "appname is empty skip" && exit 0
+
+apt remove -y "$appname"
+
+sudo systemctl stop "$appname".service
+sudo systemctl disable "$appname".service
+sudo dpkg -r "$appname"
+sudo dpkg --purge "$appname"
+sudo rm -rf /var/lib/dpkg/info/"$appname".*
+
+systemctl disable "$appname".service >/dev/null 2>&1 || true
+rm -f /lib/systemd/system/"$appname".service
+#rm -f /data/"$appname".log
+systemctl daemon-reload
+dpkg --remove --force-remove-reinstreq "$appname"
\ No newline at end of file
diff --git a/lsy-loader/lsyloader/data/lsyloader/version.ini b/lsy-loader/lsyloader/data/lsyloader/version.ini
new file mode 100644
index 0000000..1b34713
--- /dev/null
+++ b/lsy-loader/lsyloader/data/lsyloader/version.ini
@@ -0,0 +1,13 @@
+[{
+ "version": "1.0.1",
+ "name": "lsyloader",
+ "path": "http://192.168.200.128:5212/versionFile?filename=lsyloader1.0.1.deb",
+ "sign": "3973118446a2c81db53803633ca84b287fe80197a707f5d7b8a6cfd712f30c0a"
+ },
+ {
+ "version": "1.0.3",
+ "name": "lsyupdate",
+ "path": "http://192.168.200.128:5212/versionFile?filename=lsyupdate1.0.3.deb",
+ "sign": "b990a391dc7b8fd2bce1f22c80be674a764d725f87bd706a81f6dd1225210010"
+ }
+]
\ No newline at end of file
diff --git a/lsy-loader/lsyloader/lib/systemd/system/lsyloader.service b/lsy-loader/lsyloader/lib/systemd/system/lsyloader.service
new file mode 100644
index 0000000..d388788
--- /dev/null
+++ b/lsy-loader/lsyloader/lib/systemd/system/lsyloader.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=lsy update Service
+After=network.target
+
+[Service]
+ExecStart=/data/lsyloader/lsyloader.sh
+Restart=always
+User=root
+Group=root
+
+[Install]
+WantedBy=multi-user.target
diff --git a/lsy-loader/lsyloader1.0.0.deb b/lsy-loader/lsyloader1.0.0.deb
new file mode 100755
index 0000000000000000000000000000000000000000..3a1c3ffbfa1b2a9cfe668a055e96e375ddfbaead
GIT binary patch
literal 4072
zcmaiyWmFT6{>BH48Z|~r4rwGtjFJYaNlJrsH;fceTFMd9NC+b)C^=*(NJ}H#rF1u<
zp#R_fpL_4y`#I0~p7XqTzOOzUa(4a>t_mPWCwn(LZy|d(Z#(}`C=@CxB`zT$CM_cd
zheBch^#5E@7)(+^0t)>n|Hc+1CJX~P_;?5S`*;cm*!c@TLk9fMJ^Wu!{vTTqA6Def
z5x|=T2AEjrbHcnX0CYk%K34)<_cx?eFp>_~A=BLH_B-y8OD>Hr
sTvjh=jM(FV70BKyO5ob`q3J1hlzS)!?b7&v^vu8wx
zrE4|F(IGg}zOR+daYxOA&2zYVL$|E{gi_vFClk}n9nOcP$9gVm29>5f`1Me
-<
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/dev/null 2>&1 || true
+rm -f /lib/systemd/system/"$appname".service
+rm -f /data/"$appname".log
+systemctl daemon-reload
+dpkg --remove --force-remove-reinstreq "$appname"
\ No newline at end of file
diff --git a/lsy-update/build.sh b/lsy-update/build.sh
new file mode 100755
index 0000000..a2d010f
--- /dev/null
+++ b/lsy-update/build.sh
@@ -0,0 +1,5 @@
+dpkg-deb --build lsyupdate
+ver=$(dpkg-deb --show lsyupdate.deb|awk '{print $2}')
+mv lsyupdate.deb lsyupdate$ver.deb
+echo `sha256sum "lsyupdate$ver.deb"`>>"lsyupdate$ver.debSign"
+chmod 777 *.deb
\ No newline at end of file
diff --git a/lsy-update/install.sh b/lsy-update/install.sh
new file mode 100755
index 0000000..e63c944
--- /dev/null
+++ b/lsy-update/install.sh
@@ -0,0 +1,11 @@
+
+cur_dir=$(dirname "$(realpath "$0")")
+
+# sudo dpkg -i lsyupdate1.0.0.deb
+
+cp *.deb /tmp/
+
+# deb必须放在/tmp这种有自由权限的目录
+# apt会自动处理依赖关系
+sudo apt install -y --allow-downgrades "/tmp/lsyupdate1.0.0.deb"
+
diff --git a/lsy-update/lsy_update-bak.sh b/lsy-update/lsy_update-bak.sh
new file mode 100755
index 0000000..73773e0
--- /dev/null
+++ b/lsy-update/lsy_update-bak.sh
@@ -0,0 +1,217 @@
+#!/bin/bash
+
+
+#### version接口
+# {
+# "version": "1.2.3",
+# "path": "http://192.168.200.128:5212/versionFile?filename=app1.2.3",
+# "sign": "2d28d9af69d48c964abafaff97f6e9958ecf40a9ca6d62a7ae69e00b279c22f2"
+# }
+
+mkdir -p "/data"
+
+logFile="/data/lsyudpate.log"
+maxLogSize=$((1024*1024*3))
+url="http://192.168.200.128:5212/version"
+versionLocal="1.0.1"
+
+pkgUrl=""
+pkgVersion=""
+pkgSign=""
+outPath="out.deb"
+
+
+function initLog() {
+ [ ! -e "$logFile" ] && return
+ local size=`ls -al "$logFile" |awk '{print $5}'`
+ echo $size
+ [ $size -gt $maxLogSize ] && rm -rf "$logFile"
+}
+
+function freshNow() {
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+}
+
+function get_json_value() {
+ awk -v json="$1" -v key="$2" -v defaultValue="$3" 'BEGIN{
+ foundKeyCount = 0
+ while (length(json) > 0) {
+ # pos = index(json, "\""key"\""); ## 这行更快一些,但是如果有value是字符串,且刚好与要查找的key相同,会被误认为是key而导致值获取错误
+ pos = match(json, "\""key"\"[ \\t]*?:[ \\t]*");
+ if (pos == 0) {if (foundKeyCount == 0) {print defaultValue;} exit 0;}
+
+ ++foundKeyCount;
+ start = 0; stop = 0; layer = 0;
+ for (i = pos + length(key) + 1; i <= length(json); ++i) {
+ lastChar = substr(json, i - 1, 1)
+ currChar = substr(json, i, 1)
+
+ if (start <= 0) {
+ if (lastChar == ":") {
+ start = currChar == " " ? i + 1: i;
+ if (currChar == "{" || currChar == "[") {
+ layer = 1;
+ }
+ }
+ } else {
+ if (currChar == "{" || currChar == "[") {
+ ++layer;
+ }
+ if (currChar == "}" || currChar == "]") {
+ --layer;
+ }
+ if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) {
+ stop = currChar == "," ? i : i + 1 + layer;
+ break;
+ }
+ }
+ }
+
+ if (start <= 0 || stop <= 0 || start > length(json) || stop > length(json) || start >= stop) {
+ if (foundKeyCount == 0) {print defaultValue;} exit 0;
+ } else {
+ print substr(json, start, stop - start);
+ }
+
+ json = substr(json, stop + 1, length(json) - stop)
+ }
+ }'
+}
+
+# split_str "${tmp_data}" "|"
+split_str_return_list=()
+function split_str() {
+ local str_data=$1
+ local str_pattern=$2
+
+ str=$str_data
+ delimiter=$str_pattern
+
+ array=()
+ while [ "$str" ]; do
+ substring="${str%%"$delimiter"*}"
+ [ -z "$substring" ] && str="${str#"$delimiter"}" && continue
+ array+=( "$substring" )
+ str="${str:${#substring}}"
+ [ "$str" == "$delimiter" ] && break
+ done
+ #declare -p array
+
+ split_str_return_list=()
+ for var in "${array[@]}"; do
+ #echo "[v]=${var}"
+ split_str_return_list+=( "${var}" )
+ done
+}
+
+function trimL() {
+ local str=$1
+ local toTrim=$2
+ local dst=${str#$toTrim}
+ echo $dst
+}
+function trimR() {
+ local str=$1
+ local toTrim=$2
+ local dst=${str%$toTrim}
+ echo $dst
+}
+function trim() {
+ local str=$1
+ local toTrim=$2
+ str=${str#$toTrim}
+ local dst=${str%$toTrim}
+ echo $dst
+}
+
+
+function hasVersion() {
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] hasVersion start" >> $logFile
+
+ local str_ack=$(
+ curl --request GET \
+ --url "$url" \
+ --header 'content-type: application/json' \
+ --data ""
+ )
+
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] hasVersion done,$str_ack" >> $logFile
+
+ local version=$(get_json_value "$str_ack" "version" "-1")
+ version=$(trim "$version" "\"")
+ split_str "${version}" "."
+ len=${#split_str_return_list[@]}
+ if [ ! $len -eq 3 ];then
+ return 0
+ fi
+ local v1=${split_str_return_list[0]}
+ local v2=${split_str_return_list[1]}
+ local v3=${split_str_return_list[2]}
+
+ split_str "${versionLocal}" "."
+ local lv1=${split_str_return_list[0]}
+ local lv2=${split_str_return_list[1]}
+ local lv3=${split_str_return_list[2]}
+
+ pkgUrl=$(get_json_value "$str_ack" "path" "")
+ pkgVersion=$version
+ pkgSign=$(get_json_value "$str_ack" "sign" "")
+
+ pkgUrl=$(trim "$pkgUrl" "\"")
+ pkgSign=$(trim "$pkgSign" "\"")
+
+ echo "[$nowtime] pkgVersion=$pkgVersion" >> $logFile
+ echo "[$nowtime] pkgUrl=$pkgUrl" >> $logFile
+ echo "[$nowtime] pkgSign=$pkgSign" >> $logFile
+
+ [ -z "$pkgUrl" ] && echo "[$nowtime] pkgurl empty skip" >> $logFile && return 0
+ [ -z "$pkgSign" ] && echo "[$nowtime] pkgSign empty skip" >> $logFile && return 0
+
+ echo "[$nowtime] v=$v1.$v2.$v3" >> $logFile
+ echo "[$nowtime] lv=$lv1.$lv2.$lv3" >> $logFile
+
+ [ $v1 -gt $lv1 ] && return 1
+ [ $v2 -gt $lv2 ] && return 1
+ [ $v3 -gt $lv3 ] && return 1
+
+ return 0
+}
+
+function main() {
+ initLog
+
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] start..." >> $logFile
+
+ hasVersion
+ local bUpdate=$?
+ if [ $bUpdate -eq 0 ]; then
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] no need to update" >> $logFile
+ return
+ fi
+ echo "[$nowtime] need update" >> $logFile
+
+ freshNow
+ rm -rf "$outPath"
+ str_ack=`wget -O "$outPath" $pkgUrl`
+ [ ! -e "$outPath" ] && echo "[$nowtime] $outPath not exist" >> $logFile && return
+
+ freshNow
+ local fileSign=`sha256sum "$outPath"|awk '{print $1}'`
+ echo "[$nowtime] get sign,fileSign=$fileSign,$outPath" >> $logFile
+
+ [ "$fileSign" != "$pkgSign" ] && echo "[$nowtime] $fileSign!=$pkgSign,$outPath skip" >> $logFile && return
+
+ chmod +x "$outPath"
+ echo "[$nowtime] start run $outPath" >> $logFile
+ bash -c "./$outPath" >> $logFile
+ rm -rf "$outPath"
+
+ freshNow
+ echo "[$nowtime] finish" >> $logFile
+}
+
+main
\ No newline at end of file
diff --git a/lsy-update/lsyupdate/DEBIAN/control b/lsy-update/lsyupdate/DEBIAN/control
new file mode 100644
index 0000000..d5b249b
--- /dev/null
+++ b/lsy-update/lsyupdate/DEBIAN/control
@@ -0,0 +1,8 @@
+Package: lsyupdate
+Version: 1.0.1
+Section: utils
+Priority: optional
+Architecture: amd64
+Maintainer: lsy@mail.com
+Depends: systemd (>= 240), libc6 (>= 2.28)
+Description: lsy udpate.
diff --git a/lsy-update/lsyupdate/DEBIAN/postinst b/lsy-update/lsyupdate/DEBIAN/postinst
new file mode 100755
index 0000000..b46a22c
--- /dev/null
+++ b/lsy-update/lsyupdate/DEBIAN/postinst
@@ -0,0 +1,11 @@
+#!/bin/bash
+#set -e
+
+# Reload systemd configurations
+systemctl daemon-reload
+
+# Enable the service to start on boot
+systemctl enable lsyupdate.service
+
+# Start the service
+systemctl start lsyupdate.service
diff --git a/lsy-update/lsyupdate/DEBIAN/postrm b/lsy-update/lsyupdate/DEBIAN/postrm
new file mode 100755
index 0000000..eb9e541
--- /dev/null
+++ b/lsy-update/lsyupdate/DEBIAN/postrm
@@ -0,0 +1,9 @@
+#!/bin/bash
+#set -e
+
+
+systemctl disable lsyupdate.service >/dev/null 2>&1 || true
+rm -f /lib/systemd/system/lsyupdate.service
+rm -f /data/lsyupdate/lsyupdate.log
+systemctl daemon-reload
+
diff --git a/lsy-update/lsyupdate/DEBIAN/prerm b/lsy-update/lsyupdate/DEBIAN/prerm
new file mode 100755
index 0000000..80c0435
--- /dev/null
+++ b/lsy-update/lsyupdate/DEBIAN/prerm
@@ -0,0 +1,10 @@
+#!/bin/bash
+#set -e
+
+# Stop the service if running
+if systemctl is-active --quiet lsyupdate.service; then
+ systemctl stop lsyupdate.service
+fi
+
+# Disable the service
+systemctl disable lsyupdate.service
diff --git a/lsy-update/lsyupdate/data/lsyupdate/lsydeb.sh b/lsy-update/lsyupdate/data/lsyupdate/lsydeb.sh
new file mode 100755
index 0000000..1319ee5
--- /dev/null
+++ b/lsy-update/lsyupdate/data/lsyupdate/lsydeb.sh
@@ -0,0 +1,259 @@
+#!/bin/bash
+
+jsonIn=""
+#### jsonIn=version接口
+# {
+# "version": "1.0.5",
+# "name": "lsyupdate",
+# "path": "http://192.168.200.128:5212/versionFile?filename=lsyupdate1.0.5.deb",
+# "sign": "a0d47ccb8edaa029e2c1262a8351674846e4c055c798ad63c55851fa5dff7059"
+# }
+cur_dir=$(dirname "$(realpath "$0")")
+mkdir -p "/tmp/log"
+
+logFile="/tmp/log/lsyupdate.log"
+maxLogSize=$((1024*1024*3))
+versionLocal="1.0.0"
+url="https://deb.jxm.cool/deb/version.ini"
+
+
+# 只处理
+pkgNameArrOnly=()
+# 除了这些都处理,一般是自己, pkgNameArrOnly存在时,pkgNameArrExcept无效
+pkgNameArrExcept=("lsyupdate")
+
+
+pkgName=""
+pkgUrl=""
+pkgVersion=""
+pkgSign=""
+outPath="$cur_dir/out.deb"
+
+function initLog() {
+ [ ! -e "$logFile" ] && return
+ local size=`ls -al "$logFile" |awk '{print $5}'`
+ echo $size
+ [ $size -gt $maxLogSize ] && rm -rf "$logFile"
+}
+
+function freshNow() {
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+}
+
+function get_json_value() {
+ awk -v json="$1" -v key="$2" -v defaultValue="$3" 'BEGIN{
+ foundKeyCount = 0
+ while (length(json) > 0) {
+ # pos = index(json, "\""key"\""); ## 这行更快一些,但是如果有value是字符串,且刚好与要查找的key相同,会被误认为是key而导致值获取错误
+ pos = match(json, "\""key"\"[ \\t]*?:[ \\t]*");
+ if (pos == 0) {if (foundKeyCount == 0) {print defaultValue;} exit 0;}
+
+ ++foundKeyCount;
+ start = 0; stop = 0; layer = 0;
+ for (i = pos + length(key) + 1; i <= length(json); ++i) {
+ lastChar = substr(json, i - 1, 1)
+ currChar = substr(json, i, 1)
+
+ if (start <= 0) {
+ if (lastChar == ":") {
+ start = currChar == " " ? i + 1: i;
+ if (currChar == "{" || currChar == "[") {
+ layer = 1;
+ }
+ }
+ } else {
+ if (currChar == "{" || currChar == "[") {
+ ++layer;
+ }
+ if (currChar == "}" || currChar == "]") {
+ --layer;
+ }
+ if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) {
+ stop = currChar == "," ? i : i + 1 + layer;
+ break;
+ }
+ }
+ }
+
+ if (start <= 0 || stop <= 0 || start > length(json) || stop > length(json) || start >= stop) {
+ if (foundKeyCount == 0) {print defaultValue;} exit 0;
+ } else {
+ print substr(json, start, stop - start);
+ }
+
+ json = substr(json, stop + 1, length(json) - stop)
+ }
+ }'
+}
+
+# split_str "${tmp_data}" "|"
+split_str_return_list=()
+function split_str() {
+ local str_data=$1
+ local str_pattern=$2
+
+ str=$str_data
+ delimiter=$str_pattern
+
+ array=()
+ while [ "$str" ]; do
+ substring="${str%%"$delimiter"*}"
+ [ -z "$substring" ] && str="${str#"$delimiter"}" && continue
+ array+=( "$substring" )
+ str="${str:${#substring}}"
+ [ "$str" == "$delimiter" ] && break
+ done
+ #declare -p array
+
+ split_str_return_list=()
+ for var in "${array[@]}"; do
+ #echo "[v]=${var}"
+ split_str_return_list+=( "${var}" )
+ done
+}
+
+function trimL() {
+ local str=$1
+ local toTrim=$2
+ local dst=${str#$toTrim}
+ echo $dst
+}
+function trimR() {
+ local str=$1
+ local toTrim=$2
+ local dst=${str%$toTrim}
+ echo $dst
+}
+function trim() {
+ local str=$1
+ local toTrim=$2
+ str=${str#$toTrim}
+ local dst=${str%$toTrim}
+ echo $dst
+}
+
+function hasVersion() {
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] hasVersion start" >> $logFile
+
+ local str_ack=$jsonIn
+
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] hasVersion done,$str_ack" >> $logFile
+
+ pkgUrl=$(get_json_value "$str_ack" "path" "")
+ pkgVersion=$(get_json_value "$str_ack" "version" "-1")
+ pkgSign=$(get_json_value "$str_ack" "sign" "")
+ pkgName=$(get_json_value "$str_ack" "name" "")
+
+ pkgUrl=$(trim "$pkgUrl" "\"")
+ pkgSign=$(trim "$pkgSign" "\"")
+ pkgName=$(trim "$pkgName" "\"")
+ [ -z "$pkgName" ] && echo "pkgName is empty skip" >> $logFile && return 0
+ # pkgNameArrOnly
+ local found=false
+ for item in "${pkgNameArrOnly[@]}"; do
+ if [[ "$item" == "$pkgName" ]]; then
+ found=true
+ break
+ fi
+ done
+ [ ${#pkgNameArrOnly[@]} -ne 0 ] && [ "$found" == false ] && echo "pkgName not in $pkgNameArrOnly skip" >> $logFile && return 0
+
+ # pkgNameArrExcept
+ for item in "${pkgNameArrExcept[@]}"; do
+ if [[ "$item" == "$pkgName" ]]; then
+ echo "pkgName in $pkgNameArrExcept skip" >> $logFile && return 0
+ fi
+ done
+
+ versionLocal=$(apt show "$pkgName"|grep "Version:"|head -n 1|awk '{print $2}')
+ [ "$versionLocal" == "" ] && versionLocal="1.0.0"
+ outPath="$cur_dir/$pkgName.deb"
+
+
+ version=$(trim "$pkgVersion" "\"")
+ split_str "${version}" "."
+ len=${#split_str_return_list[@]}
+ if [ $len -lt 3 ];then
+ return 0
+ fi
+ local v1=${split_str_return_list[0]}
+ local v2=${split_str_return_list[1]}
+ local v3=${split_str_return_list[2]}
+
+ split_str "${versionLocal}" "."
+ local lv1=${split_str_return_list[0]}
+ local lv2=${split_str_return_list[1]}
+ local lv3=${split_str_return_list[2]}
+
+ echo "[$nowtime] pkgVersion=$pkgVersion" >> $logFile
+ echo "[$nowtime] pkgUrl=$pkgUrl" >> $logFile
+ echo "[$nowtime] pkgSign=$pkgSign" >> $logFile
+ echo "[$nowtime] pkgName=$pkgName" >> $logFile
+
+ [ -z "$pkgUrl" ] && echo "[$nowtime] pkgurl empty skip" >> $logFile && return 0
+ [ -z "$pkgSign" ] && echo "[$nowtime] pkgSign empty skip" >> $logFile && return 0
+
+ echo "[$nowtime] v=$v1.$v2.$v3" >> $logFile
+ echo "[$nowtime] lv=$lv1.$lv2.$lv3" >> $logFile
+
+ [ "$v1" -gt "$lv1" ] && return 1
+ [ "$v2" -gt "$lv2" ] && return 1
+ [ "$v3" -gt "$lv3" ] && return 1
+
+ return 0
+}
+
+function runInstall() {
+
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] start..." >> $logFile
+
+ hasVersion
+ local bUpdate=$?
+ if [ $bUpdate -eq 0 ]; then
+ nowtime=`date +"%Y-%m-%d %H:%M:%S"`
+ echo "[$nowtime] no need to update" >> $logFile
+ return
+ fi
+ echo "[$nowtime] need update" >> $logFile
+
+ freshNow
+ rm -rf "$outPath"
+ str_ack=`wget -O "$outPath" $pkgUrl`
+ [ ! -e "$outPath" ] && echo "[$nowtime] $outPath not exist" >> $logFile && return
+
+ freshNow
+ local fileSign=`sha256sum "$outPath"|awk '{print $1}'`
+ echo "[$nowtime] get sign,fileSign=$fileSign,$outPath" >> $logFile
+
+ [ "$fileSign" != "$pkgSign" ] && echo "[$nowtime] $fileSign!=$pkgSign,$outPath skip" >> $logFile && return
+
+ chmod +x "$outPath"
+ echo "[$nowtime] start uninstall $outPath" >> $logFile
+ bash $cur_dir/uninstall.sh "$pkgName" >> $logFile
+ echo "[$nowtime] start install $outPath" >> $logFile
+ apt install -y --allow-downgrades "$outPath" >> $logFile
+
+ freshNow
+ echo "[$nowtime] finish" >> $logFile
+}
+
+function main() {
+ initLog
+ str_ack=$(
+ curl --request GET \
+ --url "$url" \
+ --header 'content-type: application/json' \
+ --data ""
+ )
+ apps=($(echo "$str_ack" | jq -c '.[]'))
+ for item in "${apps[@]}"; do
+ jsonIn=$item
+ runInstall
+ sleep 2
+ done
+}
+main
+
diff --git a/lsy-update/lsyupdate/data/lsyupdate/lsyupdate.sh b/lsy-update/lsyupdate/data/lsyupdate/lsyupdate.sh
new file mode 100755
index 0000000..8ffce8d
--- /dev/null
+++ b/lsy-update/lsyupdate/data/lsyupdate/lsyupdate.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+cur_dir=$(dirname "$(realpath "$0")")
+while true; do
+ bash "$cur_dir/lsydeb.sh"
+ sleep 20
+done
diff --git a/lsy-update/lsyupdate/data/lsyupdate/uninstall.sh b/lsy-update/lsyupdate/data/lsyupdate/uninstall.sh
new file mode 100755
index 0000000..4642301
--- /dev/null
+++ b/lsy-update/lsyupdate/data/lsyupdate/uninstall.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# "$appname"
+appname=$1
+
+[ -z "$appname" ] && echo "appname is empty skip" && exit 0
+
+apt remove -y "$appname"
+
+sudo systemctl stop "$appname".service
+sudo systemctl disable "$appname".service
+sudo dpkg -r "$appname"
+sudo dpkg --purge "$appname"
+sudo rm -rf /var/lib/dpkg/info/"$appname".*
+
+systemctl disable "$appname".service >/dev/null 2>&1 || true
+rm -f /lib/systemd/system/"$appname".service
+#rm -f /data/"$appname".log
+systemctl daemon-reload
+dpkg --remove --force-remove-reinstreq "$appname"
\ No newline at end of file
diff --git a/lsy-update/lsyupdate/lib/systemd/system/lsyupdate.service b/lsy-update/lsyupdate/lib/systemd/system/lsyupdate.service
new file mode 100644
index 0000000..ee4a9e2
--- /dev/null
+++ b/lsy-update/lsyupdate/lib/systemd/system/lsyupdate.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=lsy update Service
+After=network.target
+
+[Service]
+ExecStart=/data/lsyupdate/lsyupdate.sh
+Restart=always
+User=root
+Group=root
+
+[Install]
+WantedBy=multi-user.target
diff --git a/lsy-update/lsyupdate1.0.0.deb b/lsy-update/lsyupdate1.0.0.deb
new file mode 100755
index 0000000000000000000000000000000000000000..c9b5b2581464d20d72d362a7e4d72542d2dbde3a
GIT binary patch
literal 3762
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
literal 0
HcmV?d00001
diff --git a/lsy-update/lsyupdate1.0.0.debSign b/lsy-update/lsyupdate1.0.0.debSign
new file mode 100644
index 0000000..e8b9103
--- /dev/null
+++ b/lsy-update/lsyupdate1.0.0.debSign
@@ -0,0 +1 @@
+b39ef51484b8466893a4c8bc8e8a5091efba7b528d575c39f7bdf7187c8d96d1 lsyupdate1.0.0.deb
diff --git a/lsy-update/lsyupdate1.0.1.deb b/lsy-update/lsyupdate1.0.1.deb
new file mode 100755
index 0000000000000000000000000000000000000000..8e947cdb9e5bf3814a537c8c4231fb1df0a4088b
GIT binary patch
literal 3762
zcmajdcQ_P|9|!O|n>g#rm33rh9qvMr!=3Cy_R8Mk%#P?3*+qEvLe*U8JQK?
zl08GD(C_;^zwz(y^SqzW^Su9f|MwD7bqaLxyv5?`=IrHkPsZ8no>L$W3WdrmDZ=3j
z$|^7=C=~Wj|L>QF!LGyMQ0PDT&pEOv$ii4${O<(^`uoZTI|a&y2L=D%JpzvS-(KRi
z+?gvtynqAXK4lDr)$`&Rh^Eu$%001$oL9;;EbHjAh*d-Ut1?~^pelY{fDQl+_>oXZ
zWwbe)D(s4?#1^a=-3mrKC@?4d(j5c496BRRGR>^H(AJGp6^O@$$FHY)eV6BV%umVp
zJNgo(rL@Pn$rt*3RE#nDIU`
z$ew<8bSIl#$9hWaWTYvg*)- *$aw!S;vji@zz?^R
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
literal 0
HcmV?d00001
diff --git a/lsy-update/lsyupdate1.0.1.debSign b/lsy-update/lsyupdate1.0.1.debSign
new file mode 100644
index 0000000..9ad1cae
--- /dev/null
+++ b/lsy-update/lsyupdate1.0.1.debSign
@@ -0,0 +1 @@
+88b109f8f6d0cdc6446267c9427ad4c52c0fdab62501b0e19f6a9405efe79e47 lsyupdate1.0.1.deb
diff --git a/lsy-update/showVersion.sh b/lsy-update/showVersion.sh
new file mode 100755
index 0000000..fb45236
--- /dev/null
+++ b/lsy-update/showVersion.sh
@@ -0,0 +1,2 @@
+apt show lsyupdate |grep Version
+
diff --git a/lsy-update/uninstallAll.sh b/lsy-update/uninstallAll.sh
new file mode 100755
index 0000000..dd0096e
--- /dev/null
+++ b/lsy-update/uninstallAll.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# "$appname"
+appname=$1
+
+[ -z "$appname" ] && appname="lsyupdate"
+[ -z "$appname" ] && echo "appname is empty skip" && exit 0
+
+apt remove -y "$appname"
+
+sudo systemctl stop "$appname".service
+sudo systemctl disable "$appname".service
+sudo dpkg -r "$appname"
+sudo dpkg --purge "$appname"
+sudo rm -rf /var/lib/dpkg/info/"$appname".*
+
+systemctl disable "$appname".service >/dev/null 2>&1 || true
+rm -f /lib/systemd/system/"$appname".service
+rm -f /data/"$appname".log
+systemctl daemon-reload
+dpkg --remove --force-remove-reinstreq "$appname"
\ No newline at end of file
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..2d19f10
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,24 @@
+##
+
+修改版本号
+lsy-loader/lsyloader/DEBIAN/control
+cd lsy-loader
+sh build
+生成deb
+
+修改版本号
+lsy-update/lsyupdate/DEBIAN/control
+cd lsy-update
+sh build
+生成deb
+
+##
+修改version.ini, 注意版本号,sign
+
+拷贝deb和ini到发布服务器目录
+cp -Rf *deb /data/wwwroot/deb.jxm.cool/deb/
+
+##
+确保version.ini配置正确,再拷贝到发布服务目录
+cp -Rf *ini /data/wwwroot/deb.jxm.cool/deb/
+