插件宝塔

宝塔  时间:2021-01-27  阅读:()
宝塔Linux面板插件开发文档插件安装位置:/www/server/panel/plugin/文件结构:demo_main.
py插件后端主程序(插件名称_main.
py)index.
html插件前端程序info.
json插件信息文件icon.
png插件图标文件install.
sh安装卸载脚本插件名称_main.
py内容格式以插件名称为demo示例:#!
/usr/bin/python#coding:utf-8classdemo_main:#必需与文件名一致#你的代码defget_list(self,args):#如果此方法需要被前端调用,则通过args接收前端传过来的POST/GET参数pass;info.
json内容格式:{"title":"宝塔插件DEMO",//标题名称"name":"demo",//名称,必需和插件目录名一致"ps":"宝塔插件开发示例项目",//描述"versions":"1.
0",//版本号"checks":"/www/server/panel/plugin/demo",//用于检测插件是否安装的文件或目录"author":"宝塔",//作者"home":"https://www.
bt.
cn"//作者主页}响应数据到前端:允许return到前端的数据类型:bool、str、list、dict、int不管响应什么类型的数据,都将自动转为json数据格式,若不被json对象支持,会直接报错Demo下载:https://www.
bt.
cn/demo.
zip注意:1、URL是严格大小写的2、前端请求插件请统一使用POST方式3、更详细的说明请参考demo4、在POST参数中请不要使用action、s、name、a这4个参数名public公共库引用:importpublic读取文件#@paramfilename文件名[必传]#@parammode文件打开模式默认r#@returnboolf_body=public.
ReadFile(filename,mode='r')写入文件#@paramfilename文件名[必传]#@paramf_body要写入的内容[必传]#@parammode文件打开模式默认w+#@returnboolresult=public.
WriteFile(filename,f_body,mode='w+')计算字符串的MD5#@paramstrings要被计算的字符串[必传]#@returnstring小写的MD5结果md5=public.
md5(strings)计算文件的MD5#@paramfilename文件名#@returnstring小写的MD5结果file_md5=public.
FileMd5(filename)写面板日志#@paramlog_type日志类型[必传]如:登录面板#@paramlog_body日志内容[必传]如:登录成功#@returnNonepublic.
WriteLog(log_type,log_body)使用GET方式请求HTTP#@paramurlURL地址[必传]#@paramtimeout超时时间默认60秒#@returnstring成功返回http响应内容,失败返回错误代码http_body=public.
HttpGet(url,timeout=60)使用POST方式请求HTTP#@paramurlURL地址[必传]#@paramp_dataPOST内容,请传入字典(dict)[必传]#@paramtimeout超时时间默认60秒#@returnstring成功返回http响应内容,失败返回错误代码http_body=public.
HttpPost(url,p_data,timeout=60)取随机字符串#@paramlength要获取的随机字符串长度[必传]#@returnstringrandmo_string=public.
GetRandomString(length)构造通用响应内容#@paramstatus响应状态[必传]True|False#@paramreturn_msg响应内容[必传]returnpublic.
ReturnMsg(True,'操作成功!
')取指定文件的权限#@paramfilename文件名[必传]#@returnstring权限字符器如755f_mode=public.
GetFileMode(filename)取当前使用的web服务器#@returnstring服务器类型nginx|apacheweb_server=public.
GetWebServer()重载当前web服务器public.
ServiceReload()重载指定PHP版本#@paramversionPHP版本如要重载php7.
2:72public.
phpReload()通过管道执行SHELL命令#@paramshell_str要被执行的SHELL命令[必传]#@returnlist命令执行结果返回格式:["正常输出","异常输出"]result=public.
ExecShell(shell_str)获取本服务器IP地址#@returnstringIP地址ip=public.
GetLocalIp()获取用户IP地址#@returnstringIP地址client_ip=public.
GetClientIp()获取当前访问的HOST及端口信息#@paramport返回端口[选传]True|False默认为Falsehost=public.
GetHost()port=public.
GetHost(True)取文件尾指定行数的内容#@praamfilename文件名[必传]#@paramnum指定要取的行数[必传]#@returnstring获取到的内容last_body=public.
GetNumLines(filename,num)字节单位转换(KB,MB,GB,TB)#@paramb_size要被转换的字节数[必传]#@returnstring转换结果size=public.
to_size(b_size)判断指定进程是否存在#@paramprocess_name进程名[必传]#@paramexe执行文件路径[选传]默认为None不判断,若传入值,验证执行文件路径#@returnboolis_exists=public.
process_exists(process_name,exe=None)取服务器mac地址mac_address=public.
get_mac_address()重启面板public.
restart_panel();取当前格式化时间#@paramformat格式,默认为%Y-%m-%d%X2018-12-1000:00:00format_date=public.
getDate(format='%Y-%m-%d%X')#XSS过滤#@paramdata要被过滤的字符串[必传]input_body=public.
checkInput(data)获取面板自带数据库的sqlite数据库对象#@paramtable表名#@return数据库对象db_obj=public.
M('sites')面板数据库对象方法列表(注意:以下示例仅是数据库操作,实际添加、删除、修改请从前端调用对应接口完成操作)获取站点id为1或2的网站列表data=public.
M('sites').
where('id=orid=',(1,2)).
field('id,name,edate,path,status').
select()获取所有网站列表并使用id降序data=public.
M('sites').
field('id,name,edate,path,status').
order('iddesc').
select()获取符合条件的一条数据find=public.
M('sites').
where('id=',(id,)).
field('id,name,edate,path,status').
find()通过网站名称获取网站idsite_id=public.
M('sites').
where('name=',('www.
bt.
cn',)).
getField('id')通过网站ID获取域名列表并使用id升序domains=public.
M('sites').
where('pid=',(site_id,)).
order('idasc').
field('id,pid,name,port,addtime').
select()删除日志public.
M('logs').
where('id=',(id,)).
delete()修改数据public.
M('logs').
where(id=,(id,)).
save('type,log','登录','登录成功!
')执行sql语句返回受影响行public.
M('logs').
execute(sql)执行sql语句返回查询结果public.
M('logs').
query(sql)构造分页数据#@paramcount数据行数[必传]#@paramp当前页默认=1#@paramrows每页行数默认=12#@paramcallbackjs回调方法名称,如果您是通过JS调用分页数据,请传入js回调方法名称#@paramresult分页结构默认='1,2,3,4,5,8',完整的是:'1,2,3,4,5,6,7,8'请根据需求调整#@return{'page':构造好的颁布数据,'shift':偏移位置,'row':偏移量}page_data=public.
get_page(count,p=1,rows=12,callback='',result='1,2,3,4,5,8')示例:获取网站数据并构造分页#取网站数量count=public.
M('sites').
count()取分页数据page_data=public.
get_page(count,p=1,rows=12,callback='get_sites_list',result='1,2,3,4,5,8')#通过page_data['shift'],page_data['ros']获取数据列表site_list=public.
M('sites').
order('iddesc').
limit(page_data['shift'],page_data['ros']).
field('id,name,edate,path,status').
select()#构造返回字典data={'data':site_list,'page':page_data['page']}returndata任务队列对象引用模块:importpanelTask实例化对象:t=panelTask.
bt_task()创建任务队列result=t.
create_task(task_name,task_type,task_shell,other='')参数说明:#@paramtask_name字符串任务名称[必传](可以是中文)#@paramtask_type整数任务类型[必传]0.
执行SHELL1.
下载文件2.
解压文件3.
压缩文件#@paramtask_shell字符串SHELL命令[必传]如果task_type=0,请传入SHELL命令如果task_type=1,请传入URL地址如果task_type=2,请传入压缩包文件全路径如果task_type=3,请传入被压缩的文件或目录的父路径(完整)#@paramother字符串其它参数[必传]如果task_type=0,此参数可不传如果task_type=1,请传入用于保存下载文件的全路径如:/www/test.
zip如果task_type=2,请传入JSON字符串,示例:{"dfile":"解压目录全路径","password":"解压密码(无密码请传空字符串)"}如果task_type=3,请传入JSON字符串,示例:{"sfile":"被压缩的文件或目录名称(非全路径)","dfile":"用于保存压缩包的全路径,如:/www/test.
zip","z_type":"压缩类型(示例:tar.
gz,rar,zip)"}执行SHELL命令示例:t.
create_task('查看分区',0,'df-h')下载文件:t.
create_task('下载文件test.
zip',1,'http://www.
bt.
cn/test.
zip','/www/test.
zip')解压文件到/www/test:t.
create_task('解压test.
zip',2,'/www/test.
zip','{"sfile":"/www/test","password":""}')压缩/www目录下的test目录到/www/test.
zip:t.
create_task('压缩test',3,'/www',{"sfile":"test","dfile":"/www/test.
zip","z_type":"rar"})插件动态路由前言:插件动态路由不继承面板会话权限,需开发者自己在插件(_check方法)中做好访问权限的控制,请谨慎使用访问方式:http://面板地址:端口/插件名称/被访问的插件方法.
响应类型(html|json)名词解释:插件名称:info.
json中的name字段值被访问的方法:插件控制器类中的方法名称,如demo_main类中的get_logs响应类型:html以模板的方式响应json响应json数据,若不加.
(html|json)则原样输出插件方法返回的数据插件静态文件主要用于访问插件中要用上的js/css/字体/html等,请不要将重要数据放到静态目录静态目录名称:static访问示例如要访问demo插件以下路径的静态文件:.
/static/js/test.
jshttp://demo.
cn:8888/demo/static/js/test.
js使用模板宝塔面板中使用jinja2模板引擎渲染模板,要在插件中使用jinja2模板,需在插件目录下创建templates目录,并创建对应方法的模板文件注意:在插件模板中支持jinja2语法,但无法使用extends语句模板包含(>=6.
9.
19测试版或>=6.
9.
5正式版)创建头部文件.
/templates/head.
html在模板任意位置插入包含语句{%include"head.
html"%}模板响应过程:用户请求>>检查访问权限(_check|login)>>检查模板是否存在>>执行方法>>输出模板变量关于模板变量:插件方法返回的数据将被传递到data变量中,请尽量在插件方法在构造dict返回给模板,在模板中请通过data变量来访问对应的数值使用示例:使用模板的方式访问demo插件中的get_logs方法1、创建模板文件.
/templates/get_logs.
html内容{{data['test']}}2、编写get_logs方法:defget_logs(self,args):return{'test':'test'}3、以模板的方式请求:http://demo.
cn:8888/demo/get_logs.
html4、响应内容test开发Ajax接口(响应JSON)要开发ajax接口,仅需要以json的响应类型访问即可,面板会自动将插件方法的返回值系列化为JSON字符串响应使用示例:http://demo.
cn:8888/demo/get_logs.
json自定义响应访问方式:http://demo.
cn:8888/demo/get_logs重定向示例代码:fromflaskimportredirect#引用重定向对象defget_logs(self,args):returnredirect('/login',302)#返回重定向对象重定向代码支持(302|301|303|305|307)直接输出HTML示例代码:defget_logs(self,args):html_body=""returnhtml_body输出文件示例代码:fromflaskimportsend_file#引用文件发送对象defget_file(self,args):returnsend_file('.
/test.
zip')

80VPS:香港服务器月付420元;美国CN2 GIA独服月付650元;香港/日本/韩国/美国多IP站群服务器750元/月

80vps怎么样?80vps最近新上了香港服务器、美国cn2服务器,以及香港/日本/韩国/美国多ip站群服务器。80vps之前推荐的都是VPS主机内容,其实80VPS也有独立服务器业务,分布在中国香港、欧美、韩国、日本、美国等地区,可选CN2或直连优化线路。如80VPS香港独立服务器最低月付420元,美国CN2 GIA独服月付650元起,中国香港、日本、韩国、美国洛杉矶多IP站群服务器750元/月...

RAKsmart裸机云/云服务器/VPS全场7折,独立服务器限量秒杀$30/月起

适逢中国农历新年,RAKsmart也发布了2月促销活动,裸机云、云服务器、VPS主机全场7折优惠,新用户注册送10美元,独立服务器每天限量秒杀最低30.62美元/月起,美国洛杉矶/圣何塞、日本、香港站群服务器大量补货,1-10Gbps大带宽、高IO等特色服务器抄底价格,机器可选大陆优化、国际BGP、精品网及CN2等线路,感兴趣的朋友可以持续关注下。裸机云新品7折,秒杀产品5台/天优惠码:Bare-...

Virmach 3.23美元可用6个月的VPS主机

Virmach 商家算是比较久且一直在低价便宜VPS方案中玩的不亦乐乎的商家,有很多同时期的商家纷纷关闭转让,也有的转型到中高端用户。而前一段时间也有分享过一次Virmach商家推出所谓的一次性便宜VPS主机,比如很低的价格半年时间,时间到服务器也就关闭。这不今天又看到商家有提供这样的产品。这次的活动产品包括圣何塞和水牛城两个机房,为期六个月,一次性付费用完将会取消,就这么特别的产品,适合短期玩玩...

宝塔为你推荐
华为p40和mate30哪个好荣耀30pro和华为p40对比。,哪个更值得入手?电视直播软件哪个好电视直播软件哪个好英语词典哪个好买什么英语词典比较好核芯显卡与独立显卡哪个好核芯显卡和独立显卡有什么区别?最好的是哪个?核芯显卡与独立显卡哪个好核芯显卡与独立显卡哪个好尼康和佳能单反哪个好尼康和佳能哪个好啊?固定利率和浮动利率哪个好应当选择固定利率,还是选择浮动利率还款?云盘哪个好网盘哪个好用?飞信空间登录移动飞信客户端怎么登陆???dns服务器地址如何知道自己的IP地址和DNS服务器地址?
山东vps 北京vps主机 免费cn域名 骨干网 香港vps99idc softlayer 128m内存 l5520 宕机监控 智能骨干网 台湾谷歌地址 hkg 免费高速空间 福建铁通 腾讯总部在哪 便宜空间 畅行云 网页加速 金主 七牛云存储 更多