(原) Termux应用:自动更新博客hugo

原创文章,请后转载,并注明出处。

最近玩Termux,将hugo装在了手机上。我现在可以随时随地写博客,并写随时可以查看内容。

不过必须这只是在自己手机上,网上的博客(https://i.scwy.net)内容如何更新呢,必须要让它自动化,这是IT人的执着。

废话不多,代码人用代码说话,这是第一个版本:

#!/bin/bash
#
# 将本机博客内容更新到服务器
# 此脚本只需要每天定时运行一次即可
# 脚本需要安装:jq,用于json内容的获取
#               Termux-API,与手机硬件互动
#
#

#检测网络链接畅通
function network()
{
    #超时时间
    local timeout=1

    #目标网站
    local target=www.baidu.com

    #获取响应状态码
    local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1`

    if [ "x$ret_code" = "x200" ]; then
        #网络畅通
        return 1
    else
        #网络不畅通
        return 0
    fi

    return 0
}

#检测是否为wifi连通
function wifi()
{
    # sed为过滤结果中的双引号
    local wifi_state=`termux-wifi-connectioninfo | jq .supplicant_state | sed 's/\"//g'`
    if [ "$wifi_state" = "COMPLETED" ]; then
       # wifi连接中
       return 1
    else
       # wifi未连接
       return 0
    fi

    return 0
}

# 主程序 -------------------------------------------------------------

# 检查网络是否通畅
network
if [ $? -eq 0 ];then
        termux-tts-speak "网络不畅通,请检查网络设置!"
        exit -1
fi

# 是否为wifi状态
wifi
if [ $? -eq 0 ];then
        termux-tts-speak "不是wifi下,暂不更新!"
        exit -1
fi

# 进入博客目录
cd /data/data/com.termux/files/home/hugo/EaseBlog

# 生成静态博客
hugo

# 这里可以添加:仅新文件上传

# 上传目录
scp -r public/* abc@scwy.net:/blog

将此脚本定时运行1次,例如凌里1点,让它自动更新吧。


这是第二个版本,通过md5来比较更新。

添加了编辑快捷,例如我的脚本名称blog,编辑it/2021/121009-termux.md这个文件:

blog edit 121009-termux

脚本会自动搜索目录,匹配121009-termux.md文件。并且打开nano进行编辑。

现在存在的问题是:总有几个文件会出现在更新里,它原本没有任何改动。也不应该是相互依赖(上一篇、下一篇,同tag)

#!/bin/bash

#
# 博客Hugo工具
#
# sql_table="select * from sqlite_master where type=\"table\";"   #查表结构
#

blog_path="/data/data/com.termux/files/home/hugo/EaseBlog"  #博客目录
replace_path="\/data\/data\/com.termux\/files\/home\/hugo\/EaseBlog\/public"   #用于上传时替换现有路径
ssh_link="ease@scwy.net"
server_blog_path="/data/blog"
sqlitedb="sqlite3 $blog_path/blog_md5.db"
scp_blog=$ssh_link":"$server_blog_path  #SCP上传目录
now=`date +%Y%m%d%H%M%S`  #当前时间
show_char="|/-\\"         #滚动状态字符
num=0                     #用于显示运行的滚动状态
total=0                   #用于文件计数
upfile_list=()            #保存更新文件
upfile_num=0              #更新文件数量

# 帮助信息
function help()
{
   echo ""
   echo " 博客工具 by Ease"
   echo ""
   echo " (无参数)            更新生成静态博文"
   echo " help                帮助信息"
   echo " edit 博文名称       编辑博文"
   echo " list                博客分类"
   echo " new 分类 博文名称   新建博文"
   echo " upall               完全同步"
   echo " up                  差量同步"
   echo ""
}

# 文件遍历
function ergodic()
{
  for file in `ls $1`
  do
     num=$[$[$num+1]%5];    #用于显示运行的滚动状态
     total=$[$total+1];     #用于文件计数
     if [ -d $1"/"$file ]
     then
         ergodic $1"/"$file
     else
         local path=$1"/"$file
         local name=$file
         #这里存在中文文件名出错的可能
         local file_stat=`stat $path | grep Modify -B 1 | grep Access | awk -F. '{print $1}' | awk '{print $2$3}'| awk -F- '{print $1$2$3}' | awk -F: '{print $1$2$3}'`
         if [[ "$file_stat" != "" ]]; then
              local time_sub=$[$now-$file_stat]   # 文件修改时间与当前时间差
              if [ $time_sub -lt 172800  ]; then   # 两天内的文章
                 echo -n -e "\b\b\b\b\b"
                 upfile_list[$upfile_num]=$path
                 upfile_num=$[$upfile_num+1]
              fi
         fi
         echo -n -e "\b\b\b\b\b"${show_char: num: 1}
     fi
  done
}


# 文件遍历(MD5)
function ergodic1()
{
  for file in `ls $1`
  do
     num=$[$[$num+1]%4];    #用于显示运行的滚动状态
     total=$[$total+1];     #用于文件计数
     echo -n -e "\b\b\b\b\b\b\b\b" ${show_char: num: 1} $total
     if [ -d $1"/"$file ]
     then
         ergodic1 $1"/"$file
     else
         local path=$1"/"$file
         local name=$file
         local md5=`md5sum $path|cut -d ' ' -f1`
         local sql_query="select filemd5 from blog where filename='$path';"  #查询表
         local sql_update="update blog set filemd5='$md5' where filename='$path';"  #更新表
         local sql_insert="insert into blog(filename,filemd5) values ('$path','$md5');"
         local query=$($sqlitedb << EOF
$sql_query
.quit
EOF
)
         ret=`echo $query`
         if [ "$ret" == "" ]; then
            # 不存在,添加
            local insert=$($sqlitedb << EOF
$sql_insert
.quit
EOF
)
            echo -e "\b\b\b\b\b\b\b\b\b"添加 $path
            #echo $insert
            upfile_list[$upfile_num]=$path
            upfile_num=$[$upfile_num+1]
         else
            # 存在,比较md5
            if [ "$ret" == "$md5" ]; then
               echo -n
            else
               local update=$($sqlitedb << EOF
$sql_update
.quit
EOF
)
               echo -e "\b\b\b\b\b\b\b\b\b"更新 $path
               upfile_list[$upfile_num]=$path
               upfile_num=$[$upfile_num+1]
            fi
         fi

     fi
done
}

# 编辑博文
if [ "$1" = "edit" ] || [ "$1" = "e" ]; then
   filename=""
   # 获取分类
   for bType in `ls $blog_path/content`
   do
       # 获取年份
       for bYear in `ls $blog_path/content/$bType`
       do
          # 组合文件名
          filename=$blog_path/content/$bType/$bYear/$2.md
          if [ -f $filename ]; then
             echo $filename
             nano $filename
             exit 0
          fi
       done
   done
   echo "没有匹配的博文"
fi

# 新建博文
if [ "$1" = "new" ] || [ "$1" = "n" ]; then
   if [ "$2" = "" ] || [ "$3" = "" ]; then
       echo ""
       echo "格式不对,请查看帮助信息。"
       echo ""
       help
       exit 0
   fi
   current_date=`date +%m%d%H`
   current_year=`date +%Y`
   blog_file="content/$2/$current_year/$current_date-$3.md"
   echo "新建博文" $blog_file
   cd $blog_path
   hugo new $blog_file
   nano $blog_file
   exit 0
fi



# 更新博客
if [ "$1" = "" ]; then
   cd $blog_path
   hugo
   exit 0
fi

# 完整更新
if [ "$1" = "upall" ] || [ "$1" = "a" ]; then
   cd $blog_path
   scp -r public/* $scp_blog
   exit 0
fi

# 列出博客分类
if [ "$1" = "list" ] || [ "$1" = "l" ]; then
   cd $blog_path/content
   ls
   exit 0
fi

# 帮助
if [ "$1" = "help" ] || [ "$1" = "h" ]; then
   help
   exit 0
fi

# 差异更新
if [ "$1" = "up" ] || [ "$1" = "u" ]; then
   echo $(date "+%Y-%m-%d %H:%M:%S") 生成静态博文
   cd $blog_path
   hugo
   echo
   echo $(date "+%Y-%m-%d %H:%M:%S") 搜索修改的文件
   ergodic1 $blog_path/public
   echo -e "\b\b\b\b\b\b\b\b"
   echo $(date "+%Y-%m-%d %H:%M:%S") 结束搜索,共搜索 $total 个文件,发现 $upfile_num 个更新。
   for value in ${upfile_list[*]}
   do
      file=${value##*/}
      scp_file=`echo $value | sed "s/$replace_path//"`
      scp_path=`echo $scp_file | sed "s/\/$file//"`
      echo $value
      echo "     ===> " $scp_blog$scp_file
      #hugo的特点,静态文章每篇都生成一个目录
      #更优的是先判断是否存在此目录,但粗暴的直接建立也没什么问题
      ssh -q $ssh_link "mkdir "$server_blog_path$scp_path >/dev/null 2>&1
      scp -q $value $scp_blog$scp_file   #目录下面是index.html
   done
   echo
   echo $(date "+%Y-%m-%d %H:%M:%S") 更新完成
   echo 博客 `date` >> ~/rec.txt
   exit 0
fi

2022.1.13

发现脚本的一个问题:

当新加博文时,由于服务器上没有此目录,将导致上传失败。这里需要增加判断。

稍后处理。

相关文章