- Notifications
You must be signed in to change notification settings - Fork103
Golang + Beego 编写 提供开发/运维常用操作的HTTP API接口: 手机归属地查询、IP地址查询、工作日节假日判断、微信报警、钉钉报警、2步验证、密码存储、发送邮件、生成随机密码等功能
License
chanyipiaomiao/devops-api
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Golang + Beego编写, 提供一些开发/运维常见操作的HTTP API接口,提供开发/运维常用操作的HTTP API接口: 手机归属地查询、IP地址查询、工作日节假日判断、微信报警、钉钉报警、2步验证、密码存储、发送邮件、生成随机密码等功能
- 手机归属地查询
- IP地址查询
- 工作日节假日判断
- 微信报警
- 钉钉报警
- 2步验证(Google Authenticator验证)
- 密码存储
- 发送邮件
- 生成随机密码
- 获取字符串的MD5值
- 生成验证密码
更多功能,正在思考中...
直接下载二级制文件即可
配置文件说明:
- app.conf 主配置文件
- dev.conf 开发时的配置文件
- prod.conf 线上生产运行时的配置文件
- authpassword.conf 验证密码配置文件
- db.conf 数据库配置文件
- email.conf 邮箱用户名和密码配置
- log.conf 日志相关配置
- security.conf 安全相关的配置
- twostep.conf 2步验证相关
- weixin.conf 微信报警相关
- phone.conf 手机归属地查询配置
主配置文件 app.conf 通过include的方式加载其他的配置文件
注意: 如果配置文件security.conf中, security->enableToken 的值是 false, 可以跳过 步骤2 和 步骤3, 默认为true, 如果是false 可以不用在请求头里面添加 DEVOPS-API-TOKEN 头
自定义配置(该步骤可选)
- 配置监听端口
- 配置上传目录,确保有权限写入
- 配置日志目录,默认情况当前目录下,确保有权限写入
- 配置日志最大存放天数
- 配置邮箱地址、端口、用户名、密码
- 配置是否启用token验证
- 配置jwt token签名字符串,请自行生成修改
- 配置微信报警的配置, corpID、warningAppAgentID、warningAppSecret,可参考文档设置微信报警流程
- 配置钉钉机器人的URL(可选)
首先初始化, 会生成root token,该root token 管理其他的token(该步骤可选)
./devops-api init
注意: 忘记root token, 可以使用以下重新生成./devops-api init --refresh-root-token
- 使用root token 生成普通的token,用于验证请求(该步骤可选)
./devops-api token --create=名称 --root-token=上边的root token注意:忘记token,重新生成即可
- 启动服务
./devops-api server --mode=prod--mode 指定程序运行模式, prod: 生产模式 dev: 开发模式, 默认是开发模式也可以在配置文件app.conf中修改 runmode=prod 也可以设置为生产模式
使用生成token就能愉快的访问API了注意: token必须放到请求头里面,名称必须是: DEVOPS-API-TOKEN
- 获取帮助
./devops-api --help
- 备份数据库文件
./devops-api backup --filepath=备份文件路径
gogetgithub.com/astaxie/beegogogetgithub.com/robfig/crongogetgopkg.in/alecthomas/kingpin.v2gogetgithub.com/satori/go.uuidgogetgithub.com/sec51/twofactorgogetgithub.com/tidwall/gjsongogetgithub.com/chanyipiaomiao/hltoolgogetgithub.com/chanyipiaomiao/weixin-kitgogetgithub.com/chanyipiaomiao/calgogetgithub.com/chanyipiaomiao/ip2region/binding/golanggogetgithub.com/chanyipiaomiao/phonedata
本功能使用了xluohome 项目提供的手机归属地数据库
首先进入到script目录,执行 get_phone_dat.sh 来下载数据文件,可以定期执行脚本获取最新的.
/api/v1/queryphone?phone=手机号phone 要查询的手机号返回:
{"data": {"AreaZone":"021","CardType":"中国移动","City":"上海","PhoneNum":"xxxxxxxxxx","Province":"上海","ZipCode":"200000" },"entryType":"Query Phone Location","errmsg":"","requestId":"0860edaa-db7f-46ee-ac89-d41eeb2ed80d","statuscode": 0}本功能使用了狮子的魂 项目提供的IP地址数据库.
首先进入到script目录, 执行 gen_ip_region.sh 脚本, 来下载IP地址数据库, 可以定期执行脚本获取最新的.
GET /api/v1/queryip?ip=xxx.xxx.xxx.xxxip 要查询的IP地址返回:
{"data": {"ip":"xxx.xxx.xxx.xxx","ipInfo": {"CityId": 995,"Country":"中国","Region":"0","Province":"上海","City":"上海市","ISP":"电信" } },"entryType":"Query IP","errmsg":"","requestId":"6aae483e-5c72-4cb7-bbb7-50089e2da4d3","statuscode": 0}POST /api/v1/holiworkday设置头部: Content-Type: application/json内容: 参考下面的模板
节假日和工作日模板json, 每年都要根据国内的放假安排提前做一下设置,毕竟国内放假安排不是固定的,日期不足2位必须补0
workday 是指放假安排中的调整上班的日期
{"year":"2018","holiday": [ {"name":"yuandan","zh_name":"元旦","start_time":"2018-01-01","end_time":"2018-01-01" }, {"name":"chunjie","zh_name":"春节","start_time":"2018-02-15","end_time":"2018-02-21" }, {"name":"qingming","zh_name":"清明节","start_time":"2018-04-05","end_time":"2018-04-07" }, {"name":"laodong","zh_name":"劳动节","start_time":"2018-04-29","end_time":"2018-05-01" }, {"name":"duanwu","zh_name":"端午节","start_time":"2018-06-16","end_time":"2018-06-18" }, {"name":"zhongqiu","zh_name":"中秋节","start_time":"2018-09-22","end_time":"2018-09-24" }, {"name":"guoqing","zh_name":"国庆节","start_time":"2018-10-01","end_time":"2018-10-07" } ],"workday": ["2018-02-11","2018-02-24","2018-04-08","2018-04-28","2018-09-29","2018-09-30" ]}GET /api/v1/holiworkday?date=2018-08-25date: 判断的日期, 日期格式不足2位必须补0返回:
{"data": {"date":"2018-08-25","dateType":"weekend" },"entryType":"Get Holiday/Workday","errmsg":"","requestId":"562444c2-1a48-4c69-9ed1-d2553dea3cba","statuscode": 0}dateType: 有3种 workday: 工作日 holiday: 节假日 weekend: 周末点击查看设置微信报警流程
还需要在 conf/app.conf 中配置已下3个参数
- corpID 公司或者组织的ID
- warningAppAgentID报警应用的ID
- warningAppSecret 报警应用的密钥
这3个参数可以在企业微信后台管理页面可以看到,详情可以查看上面的文档。
POST /api/v1/sendmsg/weixinmsgType: text 消息类型,目前只支持文本消息toTag: 标签ID 在企业微信后台可以查看到toUser: 用户ID 在企业微信后台可以查看到toParty: 部门ID 在企业微信后台可以查看到msg: 要发送的消息
需要在conf/app.conf 配置钉钉机器人的URL,或者是在POST中传递url参数指定钉钉机器人地址
POST /api/v1/sendmsg/dingdingmsgType: text|markdownmsg: 要发送的消息title: 发送markdown消息时需要指定此参数,指定标题url: 可以指定钉钉机器人的URL,这样就不用在conf/app.conf 配置钉钉机器人的URL注意: 在发送markdown消息时,markdown的语法可以查看官方文档
2步验证,可以方便的集成到系统中,只需要调用3个API即可.
GET /api/v1/twostepauth/enable?username=用户名&issuer=发行者username email或者是用户名issuer 可以是比如 公司的域名/公司的代号等
返回结果:
{"data": {"key":"xxxxxxxxxxxx","qrImage":"/static/download/qr/xxxx.png" },"entryType":"TwoStepAuth","errmsg":"","requestId":"e55fc2ea-4465-4a4f-aba7-f73272900b03","statuscode": 0}qrImage 2步验证 二维码图片路径key 没办法扫描二维码时可以手动添加statuscode 返回0,代表成功,其他失败POST /api/v1/twostepauth/authusername: 用户名issuer: 发行者token: 6位数字的验证码
返回结果:
{"data": {"auth": false,"issuer":"xxxxx","username":"xxxxxxx" },"entryType":"TwoStepAuth","errmsg":"Tokens mismatch.","requestId":"5529567b-1c5a-4e04-aaa0-5a86ac19ca94","statuscode": 1}auth: 验证成功true, 不成功falseGET /api/v1/twostepauth/disable?username=用户名返回结果:
{"data": {"disable":"yes","username":"xxxxx" },"entryType":"TwoStepAuth","errmsg":"","requestId":"4451ef02-f245-466a-8bb4-172238f47c50","statuscode": 0}disable: yes 禁用成功,删除二维码图片,从数据库中删除该用户POST /api/v1/storepass设置头部: Content-Type: application/json请求体内容格式:{"uniqueId":"10.10.1.2","password": [ {"name":"root","password":"444"}, {"name":"user1","password":"333"} ]}uniqueId 唯一标识注意字段名称必须是以上格式返回结果:
{"data": {"update":"ok" },"entryType":"Store Password","errmsg":"","requestId":"2494ad20-ca52-4d3e-8e8e-6dd0d6289f4a","statuscode": 0}GET /api/v1/storepass/10.10.1.2,1.1.1.1多个标识逗号分开
返回结果:
{"data": {"password": {"1.1.1.1": {},"10.10.1.2": {"root":"444","user1":"333" } } },"entryType":"Store Password","errmsg":"","requestId":"d5f61efe-8c22-4e4e-9d97-c343eb1e7f58","statuscode": 0}1.1.1.1 在数据库中不存在则返回的是空DELETE /api/v1/storepass/10.10.1.2,1.1.1.1如果请求的标识在数据库中不存从则返回空
返回结果:
{"data": {"delete":"ok","id":"10.10.1.2,1.1.1.1" },"entryType":"Store Password","errmsg":"","requestId":"29ed3301-319f-45b6-8cbd-934becc7c5cb","statuscode": 0}POST /api/v1/sendmsg/mail
- DEVOPS-API-TOKEN 指定API-TOKEN
- subject 主题
- content 内容
- type text/plain|text/html
- to 收件人多个用逗号分开
- cc 抄送人多个用逗号分开
- attach 指定附件的路径
- isattach 是否有附件 true|false
curl -X POST \ http://127.0.0.1:8080/api/v1/sendmsg/mail \ -H'DEVOPS-API-TOKEN: 生成Token' \ -H'content-type: multipart/form-data' \ -F subject=haha \ -F'content=测试一下哈' \ -F type=text/plain \ -F to=xxxx@qq.com,xxx@163.com \ -F cc=xxxx@qq.com,xxx@163.com \ -F'attach=@C:\Users\41176\Desktop\1111.txt' \ -F isattach=true
记得安装 requests
pipinstallrequests
importrequestsurl="http://127.0.0.1:8080/api/v1/sendmsg/mail"token="生成的Token"headers= {'DEVOPS-API-TOKEN':token}payload= {"subject":u"测试邮件","content":u"测试邮件内容",# u"<h1>测试邮件内容</h1>","type":"text/plain",# "text/html""to":"xxxx@qq.com,xxx@163.com","cc":"xxxx@qq.com,xxx@163.com",}response=requests.post(url,data=payload,headers=headers)print(response.json())
importrequestsurl="http://127.0.0.1:8080/api/v1/sendmsg/mail"token="生成的Token"payload= {"subject":u"测试邮件","content":u"测试邮件内容","type":"text/plain","to":"xxxx@qq.com","cc":"xxxx@163.com","isattach":"true"}headers= {'DEVOPS-API-TOKEN':token}files= {'attach':open('文件的路径','rb')}# 键名必须是 attachresponse=requests.post(url,data=payload,headers=headers,files=files)print(response.json())
记得安装 grequests
gogetgithub.com/levigross/grequests
package mainimport ("log""github.com/levigross/grequests")funcmain() {url:="http://127.0.0.1:8080/api/v1/sendmsg/mail"token:="生成的Token"o:=&grequests.RequestOptions{Headers:map[string]string{"DEVOPS-API-TOKEN":token,},Data:map[string]string{"subject":"测试邮件","content":"测试邮件内容",// <h1>测试邮件内容</h1>"type":"text/plain",// text/html"to":"xxxx@qq.com,xxx@163.com","cc":"xxxx@qq.com,xxx@163.com",},}resp,err:=grequests.Post(url,o)iferr!=nil {log.Fatalln("Unable to make request: ",err)}log.Println(resp.String())}
package mainimport ("log""os""github.com/levigross/grequests")funcmain() {url:="http://127.0.0.1:8080/api/v1/sendmsg/mail"token:="生成的token"fd,err:=os.Open("文件路径")iferr!=nil {log.Fatalln("open file error: ",err)}o:=&grequests.RequestOptions{Headers:map[string]string{"DEVOPS-API-TOKEN":token,},Data:map[string]string{"subject":"测试邮件","content":"测试邮件内容","type":"text/plain","to":"xxx@qq.com","cc":"xxxx@163.com","isattach":"true",},Files: []grequests.FileUpload{grequests.FileUpload{FileName:"上传之后生成的文件名",FileContents:fd,FieldName:"attach",// FieldName 必须是 attach},},}resp,err:=grequests.Post(url,o)iferr!=nil {log.Fatalln("Unable to make request: ",err)}log.Println(resp.String())}
GET /api/v1/password/generation
生成随机密码 默认32位, 可以添加如下参数
- length 指定长度
- name 指定多个名称,为多个名称生成密码
- specialChar 是否添加特殊字符(!@#%$*.=)到密码里面 specialChar=yes 添加,其他不添加
curl http://127.0.0.1:8080/api/v1/password/generation?length=64 \ -H'DEVOPS-API-TOKEN: 生成的Token'
export DEVOPS_API_TOKEN=生成的TokenLinux
alias genpwd="curl -H\"DEVOPS-API-TOKEN:${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation?length=64;echo"alias genpwdspecial="curl -H\"DEVOPS-API-TOKEN:${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation?length=64&specialChar=yes;echo"
Mac 可能需要把?=&转义一下
alias genpwd="curl -H\"DEVOPS-API-TOKEN:${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation\?length\=64;echo"alias genpwdspecial="curl -H\"DEVOPS-API-TOKEN:${DEVOPS_API_TOKEN}\" http://127.0.0.1:8080/api/v1/password/generation\?length\=64\&specialChar\=yes;echo"
importrequestsimportpprinturl="http://127.0.0.1:8080/api/v1/password/generation"token="生成的Token"payload= {"length":64,# 指定密码长度"name":"user1,user2,user3",# 可以为多个名称生成密码"specialChar":"yes"# 密码中是否带有特殊字符}headers= {'DEVOPS-API-TOKEN':token}response=requests.get(url,params=payload,headers=headers)pprint.pprint(response.json())
package mainimport ("log""github.com/levigross/grequests")funcmain() {url:="http://127.0.0.1:8080/api/v1/password/generation"token:="生成的Token"o:=&grequests.RequestOptions{Headers:map[string]string{"DEVOPS-API-TOKEN":token,},Params:map[string]string{"length":"64",// 指定密码长度"name":"user1,user2,user3",// 可以为多个名称生成密码"specialChar":"yes",// 密码中是否带有特殊字符},}resp,err:=grequests.Get(url,o)iferr!=nil {log.Fatalln("Unable to make request: ",err)}log.Println(resp.String())}
GET /api/v1/md5?rawstr=123456可以写一个shell脚本命令行传入字符串,返回MD5值
GET /api/v1/password/manualGenAuthPassword
手动生成验证密码,该功能是 生成一个32位的密码,然后通过钉钉或者邮件通知,别人可以拿这个密码到本程序验证是否正确,这个密码也会定时的清除,不会一直生效 执行成功返回 {"manualGenAuthPassword": true}
POST /api/v1/password/authPassword
验证密码是否正确,就上一个API生成的密码, 参数: password 执行成功返回 {"auth", true}
GET /api/v1/version
About
Golang + Beego 编写 提供开发/运维常用操作的HTTP API接口: 手机归属地查询、IP地址查询、工作日节假日判断、微信报警、钉钉报警、2步验证、密码存储、发送邮件、生成随机密码等功能
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Contributors2
Uh oh!
There was an error while loading.Please reload this page.