|  | @@ -21,11 +21,15 @@ function index()
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "subscribe"}, call("subscribe"))
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "checkport"}, call("check_port"))
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "log"}, form("shadowsocksr/log"), _("Log"), 80).leaf = true
 | 
	
		
			
				|  |  | +	entry({"admin", "services", "shadowsocksr", "get_log"}, call("get_log")).leaf = true
 | 
	
		
			
				|  |  | +	entry({"admin", "services", "shadowsocksr", "clear_log"}, call("clear_log")).leaf = true
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "run"}, call("act_status"))
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "ping"}, call("act_ping"))
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "reset"}, call("act_reset"))
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "restart"}, call("act_restart"))
 | 
	
		
			
				|  |  |  	entry({"admin", "services", "shadowsocksr", "delete"}, call("act_delete"))
 | 
	
		
			
				|  |  | +	--[[Backup]]
 | 
	
		
			
				|  |  | +	entry({"admin", "services", "shadowsocksr", "backup"}, call("create_backup")).leaf = true
 | 
	
		
			
				|  |  |  end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function subscribe()
 | 
	
	
		
			
				|  | @@ -107,9 +111,9 @@ function check_port()
 | 
	
		
			
				|  |  |  		ret = socket:connect(s.server, s.server_port)
 | 
	
		
			
				|  |  |  		if tostring(ret) == "true" then
 | 
	
		
			
				|  |  |  			socket:close()
 | 
	
		
			
				|  |  | -			retstring = retstring .. "<font color = 'green'>[" .. server_name .. "] OK.</font><br />"
 | 
	
		
			
				|  |  | +			retstring .. "<font><b style='color:green'>[" .. server_name .. "] OK.</b></font><br />"
 | 
	
		
			
				|  |  |  		else
 | 
	
		
			
				|  |  | -			retstring = retstring .. "<font color = 'red'>[" .. server_name .. "] Error.</font><br />"
 | 
	
		
			
				|  |  | +			retstring = retstring .. "<font><b style='color:red'>[" .. server_name .. "] Error.</b></font><br />"
 | 
	
		
			
				|  |  |  		end
 | 
	
		
			
				|  |  |  		if iret == 0 then
 | 
	
		
			
				|  |  |  			luci.sys.call("ipset del ss_spec_wan_ac " .. s.server)
 | 
	
	
		
			
				|  | @@ -120,7 +124,7 @@ function check_port()
 | 
	
		
			
				|  |  |  end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  function act_reset()
 | 
	
		
			
				|  |  | -	luci.sys.call("/etc/init.d/shadowsocksr reset &")
 | 
	
		
			
				|  |  | +	luci.sys.call("/etc/init.d/shadowsocksr reset >/dev/null 2>&1")
 | 
	
		
			
				|  |  |  	luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr"))
 | 
	
		
			
				|  |  |  end
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -133,3 +137,28 @@ function act_delete()
 | 
	
		
			
				|  |  |  	luci.sys.call("/etc/init.d/shadowsocksr restart &")
 | 
	
		
			
				|  |  |  	luci.http.redirect(luci.dispatcher.build_url("admin", "services", "shadowsocksr", "servers"))
 | 
	
		
			
				|  |  |  end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function get_log()
 | 
	
		
			
				|  |  | +	luci.http.write(luci.sys.exec("[ -f '/var/log/ssrplus.log' ] && cat /var/log/ssrplus.log"))
 | 
	
		
			
				|  |  | +end
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +function clear_log()
 | 
	
		
			
				|  |  | +	luci.sys.call("echo '' > /var/log/ssrplus.log")
 | 
	
		
			
				|  |  | +end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function create_backup()
 | 
	
		
			
				|  |  | +	local backup_files = {
 | 
	
		
			
				|  |  | +		"/etc/config/shadowsocksr",
 | 
	
		
			
				|  |  | +		"/etc/ssrplus/*"
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	local date = os.date("%Y%m%d")
 | 
	
		
			
				|  |  | +	local tar_file = "/tmp/shadowsocksr-" .. date .. "-backup.tar.gz"
 | 
	
		
			
				|  |  | +	nixio.fs.remove(tar_file)
 | 
	
		
			
				|  |  | +	local cmd = "tar -czf " .. tar_file .. " " .. table.concat(backup_files, " ")
 | 
	
		
			
				|  |  | +	luci.sys.call(cmd)
 | 
	
		
			
				|  |  | +	luci.http.header("Content-Disposition", "attachment; filename=shadowsocksr-" .. date .. "-backup.tar.gz")
 | 
	
		
			
				|  |  | +	luci.http.header("X-Backup-Filename", "shadowsocksr-" .. date .. "-backup.tar.gz")
 | 
	
		
			
				|  |  | +	luci.http.prepare_content("application/octet-stream")
 | 
	
		
			
				|  |  | +	luci.http.write(nixio.fs.readfile(tar_file))
 | 
	
		
			
				|  |  | +	nixio.fs.remove(tar_file)
 | 
	
		
			
				|  |  | +end
 |