其实我早就该写这篇文章了,早在2017年的时候帮公司编写一个树莓派上的lua客户端程序以及WIFI连接设置页面时就该写的,但是当时没写。所以时隔将近2年之后因为想写一个页面让负责CRM上线的同事可以通过网页就能备份整个CRM的网页和数据库时好像第一次使用OpenResty一样,什么都写不来了,一切从头开始学,虽说比起第一次学习会更快,但毕竟找资料也耽误时间,所以趁着最近事情少赶快记录下来。
这一次想到写这个页面主要是因为CRM要晚上上线,上线的同事会通知我做备份,但是回到家时间稍晚,让别人等着不好意思所以决定要做这个的。CRM服务器上我原来就写好了Shell脚本来备份数据库、网页和软件配置文件。不过上线前备份毕竟上线不改软件配置不需要备份软件配置文件,为了将其和正常备份区隔开来,复制了一份备份脚本,然后修改了这个脚本。网页备份如果要做的友好就必须在备份过程中实时将备份进度更新到网页上,而且显示格式一定要规范。 好在我之前的shell脚本输出的信息都比较规范和规整。像这样
# ./bkup_crm.sh - Create Temp Folder - Dumping MySQL Database - Backing up WebPage - Backing up Config - Create ZIP updating: bkup_crm_20190515/SQLBackup_20190515.sql (deflated 77%) updating: bkup_crm_20190515/WWWBackup_20190515.tgz (deflated 0%) updating: bkup_crm_20190515/ConfigBackup_20190515.tgz (deflated 0%) updating: bkup_crm.sh (deflated 62%) updating: del_old.sh (deflated 1%) - Removing Temp Folder - Copy Backup to Remote Server Completed! The Backup File has been created as 192.168.1.3:/backup/5kCRMBackup_20190515.zip And Local Backup File is /backup/5kCRMBackup_20190515.zip |
对lua有点了解的人一定会清楚,这是一门编程语言,游戏里用的比较多,但嵌入式场合用的也不少,比如带我入门的OpenWrt路由器操作系统。而在服务器领域,一个叫做lua-ngx的模块可以支持ngx执行lua脚本,不仅仅是干预nginx的流程,也可以用其来编写网页,配合lua-ngx的template模块更可以实现基于html模板渲染的动态页面。那么既然lua是一门编程语言,自然支持建立进程,因此可以通过访问页面的方式来触发执行特定的程序,也可以读取存放在服务器上的文本文件。是的,通过这两者配合ajax就可以实现基于页面的备份:通过访问一个Lua编写的页面由lua来执行备份脚本,同时将脚本输出重定向到一个文本文件。另一个lua页面负责读取和(基于HTML)格式化文本文件里面的内容(也就是备份脚本输出的文字),由前端页面中的javascript定期请求这个页面并将这个页面返回的包含有备份进度的html代码更新到前端网页里面制定的元素中去(通过innerHTML)。另外还有一个lua页面负责取得备份文件夹中的文件列表,将列表(基于HTML)格式化(并对手动备份的文件进行着色后)后返回给前端页面
如何用lua实现执行备份和抓取备份进度以及取得文件列表
首相讲讲lua吧,涉及上面那些操作的方法和功能(或者叫函数)
执行特定程序有两种方式: io.popen以及os.execute
io.popen: 执行一个特定的程序,返回程序输出在屏幕上的内容
os.execute: 调用系统默认命令行环境执行一个特定的程序,返回程序执行状态码
对于执行备份脚本,可随意选择使用上述两个功能中的一个,而如果像是通过ls获取备份目录中的文件列表,则只能使用io.popen。
读取文本文件使用io.open,返回一个文件句柄,通过lines()功能即可以行为单位遍历文件,lines返回的是文本变量(即string变量)。
从ls的输出内容或文件中抓出需要的内容可以通过string库的match即正则表达式抓取。
请注意,本站的所有文章均要求阁下在转载时注明出处和原作者,阁下转载本站文章即表示阁下同意并遵守此规程,除非特别注明转载出处,否则文章即为其发布者所著。本站及文章作者保留文章的著作权并有权在阁下违反上述规程时予以追究。
本文链接地址: 用OpenResty来编写页面(1)前述和架构