ipbl/src/models/ip.go

120 lines
2.5 KiB
Go
Raw Normal View History

2021-12-27 23:52:22 +01:00
package models
2021-11-07 20:44:48 +01:00
import (
2021-12-27 23:52:22 +01:00
"context"
2021-12-12 17:33:40 +01:00
"database/sql"
2021-12-10 09:24:27 +01:00
"fmt"
2021-12-12 17:33:40 +01:00
"log"
2021-11-07 20:44:48 +01:00
"net"
"time"
2021-12-27 23:52:22 +01:00
"git.paulbsd.com/paulbsd/ipbl/src/api"
2021-11-07 20:44:48 +01:00
"git.paulbsd.com/paulbsd/ipbl/src/config"
)
2021-12-27 23:52:22 +01:00
// GetIps ...
func GetIps(ctx *context.Context, config *config.Config, limit int) (apimailboxes []*api.IP, err error) {
var ips []IP
err = config.Db.Limit(limit).Find(&ips)
for _, ml := range ips {
apimailboxes = append(apimailboxes, ml.APIFormat())
}
return
}
// GetIp ...
func GetIp(ctx *context.Context, config *config.Config, ipquery interface{}) (apiip *api.IP, err error) {
var ip IP
has, err := config.Db.Where("ip = ?", ipquery).Get(&ip)
if !has {
err = fmt.Errorf("Not Found")
return nil, err
}
if err != nil {
return
}
apiip = ip.APIFormat()
return
}
func (i *IP) UpdateRDNS() (result string, err error) {
2021-11-07 20:44:48 +01:00
res, err := net.LookupAddr(i.IP)
if err != nil {
2021-12-27 23:52:22 +01:00
result = ""
} else {
result = res[0]
2021-11-07 20:44:48 +01:00
}
2021-12-27 23:52:22 +01:00
return
2021-11-07 20:44:48 +01:00
}
2021-12-12 17:33:40 +01:00
func (i *IP) InsertIP(cfg *config.Config) (num int64, err error) {
num, err = cfg.Db.Insert(i)
return
}
func InsertIPBulk(cfg *config.Config, ips *[]IP) (numinserts int64, numfail int64, err error) {
for _, ip := range *ips {
num, err := cfg.Db.Insert(ip)
if err != nil {
numfail++
continue
}
numinserts += num
}
return
}
2021-12-28 00:11:12 +01:00
func ScanIP(cfg *config.Config, lock *bool) (err error) {
if !*lock {
2021-12-28 00:14:53 +01:00
*lock = true
2021-12-28 00:11:12 +01:00
for {
var orphans = []IP{}
cfg.Db.Where("rdns IS NULL").Asc("ip").Find(&orphans)
if len(orphans) > 0 {
for _, i := range orphans {
reverse, _ := i.UpdateRDNS()
if reverse == "" {
fmt.Printf("Set \"none\" rdns to IP %s\n", i.IP)
i.Rdns.String = "none"
} else {
fmt.Printf("%s %s\n", i.IP, reverse)
i.Rdns.String = reverse
}
i.Rdns.Valid = true
_, err = cfg.Db.ID(i.ID).Cols("rdns").Update(&i)
if err != nil {
log.Println(err)
}
2021-12-10 09:24:27 +01:00
}
2021-12-28 00:11:12 +01:00
} else {
break
2021-12-10 09:24:27 +01:00
}
}
}
2021-12-28 00:11:12 +01:00
*lock = false
2021-12-12 17:33:40 +01:00
return
2021-12-10 09:24:27 +01:00
}
2021-12-27 23:52:22 +01:00
// APIFormat returns a JSON formatted object of IP
func (admin *IP) APIFormat() *api.IP {
if admin == nil {
return nil
}
return &api.IP{
ID: admin.ID,
IP: admin.IP,
Rdns: admin.Rdns.String,
Src: admin.Src,
}
}
2021-12-12 17:33:40 +01:00
// IP describe IP objects
2021-11-07 20:44:48 +01:00
type IP struct {
2021-12-12 17:33:40 +01:00
ID int `xorm:"pk autoincr" json:"-"`
IP string `xorm:"text notnull unique(ipsrc)" json:"ip"`
Rdns sql.NullString `xorm:"text default" json:"rdns"`
Src string `xorm:"text notnull unique(ipsrc)" json:"src"`
Created time.Time `xorm:"created notnull" json:"-"`
Updated time.Time `xorm:"updated notnull" json:"-"`
2021-12-11 12:59:43 +01:00
}