开头感谢sspanel的作者orvice大神!【转载请注明】
博主最近在搭建sspanel v3,中间坑确实挺多的,我回头开贴补充一下,ss服务器端我选择了orvice的shadowsocks-go mu版,因为作者是基于流量控制的机理,实际上奸商都是通过时间控制(233),所以我就寻思在作者的基础上加以修改,添加时间的限制。
注:此版本基于mysqlapi,webapi的修改方式令开贴
我在sspanel数据的user表中添加了两个字段:end_time int,到期日期(1970开始的时间戳);package_type int 套餐类型(无,月,三个月,半年,一年)。
具体可以根据自己实际需要情况修改。
首先,我们找到用户控制代码,在shadowsocks-go-mu\mu\mysql\mysql.go中,作者在这里用struct读取mysql中的数据
type User struct { id int port int passwd string method string enable int transferEnable int u int d int }
需要在里面加上我们新加的三个字段(因为我不知道go语言如何获取时间戳,所以直接从sql读了,有一个好处是如果配置多个服务器,可以保持时间同步,不受本地时间 )
end_time int //从mysql读取服务器当前时间戳 now_time int package_type int
找到读取数据库数据的方法,给上述字段赋值
func (c *Client) GetUsers() ([]user.User, error) { log.Log.Info("get mysql users") var datas []*User //查询数据库加上新增的字段 rows, err := c.db.Model(User{}).Select("id, passwd, port, method,enable,transfer_enable,u,d,end_time,UNIX_TIMESTAMP(LOCALTIME()) as now_time,package_type").Rows() if err != nil { log.Log.Error(err) var users []user.User return users, err } defer rows.Close() for rows.Next() { var data User //将读取到的到期时间和账户类型赋值 err := rows.Scan(&data.id, &data.passwd, &data.port, &data.method, &data.enable, &data.transferEnable, &data.u, &data.d, &data.end_time, &data.now_time, &data.package_type) if err != nil { log.Log.Error(err) continue } datas = append(datas, &data) } log.Log.Info(len(datas)) users := make([]user.User, len(datas)) for k, v := range datas { users[k] = v } return users, nil }
下一步,找到控制方法,增加到期自动断开
func (u *User) IsEnable() bool { if u.enable == 0 { return false } if u.u+u.d > u.transferEnable { return false } //如果过期,停用用户 if u.now_time > u.end_time { return false } return true }
有疑问的可以加群讨论,群号256950656
有疑问加站长微信联系(非本文作者)