diff --git a/cmd/cdn.go b/cmd/cdn.go new file mode 100644 index 0000000..656e5cf --- /dev/null +++ b/cmd/cdn.go @@ -0,0 +1,47 @@ +package cmd + +import ( + "bufio" + "fmt" + "os" + + "github.com/zu1k/nali/internal/app" + + "github.com/spf13/cobra" +) + +// cdnCmd represents the cdn command +var cdnCmd = &cobra.Command{ + Use: "cdn", + Short: "Query cdn service provider", + Long: `Query cdn service provider`, + Run: func(cmd *cobra.Command, args []string) { + if update { + app.UpdateDB() + } + + app.InitCDNDB() + + if len(args) == 0 { + stdin := bufio.NewScanner(os.Stdin) + for stdin.Scan() { + line := stdin.Text() + if line == "quit" || line == "exit" { + return + } + fmt.Println(app.ReplaceCDNInString(line)) + } + } else { + app.ParseCDNs(args) + } + }, +} + +var ( + update = false +) + +func init() { + rootCmd.AddCommand(cdnCmd) + cdnCmd.Flags().BoolVarP(&update, "update", "u", false, "Update CDN database") +} diff --git a/db/cdn.json b/db/cdn.json new file mode 100644 index 0000000..7cc658d --- /dev/null +++ b/db/cdn.json @@ -0,0 +1,1046 @@ +{ + "15cdn.com": { + "name": "腾正安全加速(原 15CDN)", + "link": "https://www.15cdn.com" + }, + "tzcdn.cn": { + "name": "腾正安全加速(原 15CDN)", + "link": "https://www.15cdn.com" + }, + "cedexis.net": { + "name": "Cedexis GSLB", + "link": "https://www.cedexis.com/" + }, + "cdxcn.cn": { + "name": "Cedexis GSLB (For China)", + "link": "https://www.cedexis.com/" + }, + "qhcdn.com": { + "name": "360 云 CDN (由奇安信运营)", + "link": "https://cloud.360.cn/doc?name=cdn" + }, + "qh-cdn.com": { + "name": "360 云 CDN (由奇虎 360 运营)", + "link": "https://cloud.360.cn/doc?name=cdn" + }, + "qihucdn.com": { + "name": "360 云 CDN (由奇虎 360 运营)", + "link": "https://cloud.360.cn/doc?name=cdn" + }, + "360cdn.com": { + "name": "360 云 CDN (由奇虎 360 运营)", + "link": "https://cloud.360.cn/doc?name=cdn" + }, + "360cloudwaf.com": { + "name": "奇安信网站卫士", + "link": "https://wangzhan.qianxin.com" + }, + "360anyu.com": { + "name": "奇安信网站卫士", + "link": "https://wangzhan.qianxin.com" + }, + "360safedns.com": { + "name": "奇安信网站卫士", + "link": "https://wangzhan.qianxin.com" + }, + "360wzws.com": { + "name": "奇安信网站卫士", + "link": "https://wangzhan.qianxin.com" + }, + "akamai.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "akamaiedge.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "ytcdn.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "edgesuite.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "akamaitech.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "akamaitechnologies.com": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "edgekey.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "tl88.net": { + "name": "易通锐进(Akamai 中国)由网宿承接", + "link": "https://www.akamai.com" + }, + "cloudfront.net": { + "name": "AWS CloudFront", + "link": "https://aws.amazon.com/cn/cloudfront/" + }, + "worldcdn.net": { + "name": "CDN.NET", + "link": "https://cdn.net" + }, + "worldssl.net": { + "name": "CDN.NET / CDNSUN / ONAPP", + "link": "https://cdn.net" + }, + "cdn77.org": { + "name": "CDN77", + "link": "https://www.cdn77.com/" + }, + "panthercdn.com": { + "name": "CDNetworks", + "link": "https://www.cdnetworks.com" + }, + "cdnga.net": { + "name": "CDNetworks", + "link": "https://www.cdnetworks.com" + }, + "cdngc.net": { + "name": "CDNetworks", + "link": "https://www.cdnetworks.com" + }, + "gccdn.net": { + "name": "CDNetworks", + "link": "https://www.cdnetworks.com" + }, + "gccdn.cn": { + "name": "CDNetworks", + "link": "https://www.cdnetworks.com" + }, + "akamaized.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "126.net": { + "name": "网易云 CDN", + "link": "https://www.163yun.com/product/cdn" + }, + "163jiasu.com": { + "name": "网易云 CDN", + "link": "https://www.163yun.com/product/cdn" + }, + "amazonaws.com": { + "name": "AWS Cloud", + "link": "https://aws.amazon.com/cn/cloudfront/" + }, + "cdn77.net": { + "name": "CDN77", + "link": "https://www.cdn77.com/" + }, + "cdnify.io": { + "name": "CDNIFY", + "link": "https://cdnify.com" + }, + "cdnsun.net": { + "name": "CDNSUN", + "link": "https://cdnsun.com" + }, + "bdydns.com": { + "name": "百度云 CDN", + "link": "https://cloud.baidu.com/product/cdn.html" + }, + "ccgslb.com.cn": { + "name": "蓝汛 CDN", + "link": "https://cn.chinacache.com/" + }, + "ccgslb.net": { + "name": "蓝汛 CDN", + "link": "https://cn.chinacache.com/" + }, + "ccgslb.com": { + "name": "蓝汛 CDN", + "link": "https://cn.chinacache.com/" + }, + "ccgslb.cn": { + "name": "蓝汛 CDN", + "link": "https://cn.chinacache.com/" + }, + "c3cache.net": { + "name": "蓝汛 CDN", + "link": "https://cn.chinacache.com/" + }, + "c3dns.net": { + "name": "蓝汛 CDN", + "link": "https://cn.chinacache.com/" + }, + "chinacache.net": { + "name": "蓝汛 CDN", + "link": "https://cn.chinacache.com/" + }, + "wswebcdn.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com/" + }, + "lxdns.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com/" + }, + "wswebpic.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com/" + }, + "cloudflare.net": { + "name": "Cloudflare", + "link": "https://www.cloudflare.com" + }, + "akadns.net": { + "name": "Akamai CDN", + "link": "https://www.akamai.com" + }, + "chinanetcenter.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "customcdn.com.cn": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "customcdn.cn": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "51cdn.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "wscdns.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "cdn20.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "wsdvs.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "wsglb0.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "speedcdns.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "wtxcdn.com": { + "name": "网宿 CDN", + "link": "https://www.wangsu.com" + }, + "wsssec.com": { + "name": "网宿 WAF CDN", + "link": "https://www.wangsu.com" + }, + "fastly.net": { + "name": "Fastly", + "link": "https://www.fastly.com" + }, + "fastlylb.net": { + "name": "Fastly", + "link": "https://www.fastly.com/" + }, + "hwcdn.net": { + "name": "Stackpath (原 Highwinds)", + "link": "https://www.stackpath.com/highwinds" + }, + "incapdns.net": { + "name": "Incapsula CDN", + "link": "https://www.incapsula.com" + }, + "kxcdn.com.": { + "name": "KeyCDN", + "link": "https://www.keycdn.com/" + }, + "lswcdn.net": { + "name": "LeaseWeb CDN", + "link": "https://www.leaseweb.com/cdn" + }, + "mwcloudcdn.com": { + "name": "QUANTIL (网宿)", + "link": "https://www.quantil.com/" + }, + "mwcname.com": { + "name": "QUANTIL (网宿)", + "link": "https://www.quantil.com/" + }, + "azureedge.net": { + "name": "Microsoft Azure CDN", + "link": "https://azure.microsoft.com/en-us/services/cdn/" + }, + "msecnd.net": { + "name": "Microsoft Azure CDN", + "link": "https://azure.microsoft.com/en-us/services/cdn/" + }, + "mschcdn.com": { + "name": "Microsoft Azure CDN", + "link": "https://azure.microsoft.com/en-us/services/cdn/" + }, + "v0cdn.net": { + "name": "Microsoft Azure CDN", + "link": "https://azure.microsoft.com/en-us/services/cdn/" + }, + "trafficmanager.net": { + "name": "Microsoft Azure Traffic Manager", + "link": "https://azure.microsoft.com/en-us/services/traffic-manager/" + }, + "cloudapp.net": { + "name": "Microsoft Azure", + "link": "https://azure.microsoft.com" + }, + "chinacloudsites.cn": { + "name": "世纪互联旗下上海蓝云(承载 Azure 中国)", + "link": "https://www.21vbluecloud.com/" + }, + "spdydns.com": { + "name": "云端智度融合 CDN", + "link": "https://www.isurecloud.net/index.html" + }, + "jiashule.com": { + "name": "知道创宇云安全加速乐CDN", + "link": "https://www.yunaq.com/jsl/" + }, + "jiasule.org": { + "name": "知道创宇云安全加速乐CDN", + "link": "https://www.yunaq.com/jsl/" + }, + "365cyd.cn": { + "name": "知道创宇云安全创宇盾(政务专用)", + "link": "https://www.yunaq.com/cyd/" + }, + "huaweicloud.com": { + "name": "华为云WAF高防云盾", + "link": "https://www.huaweicloud.com/product/aad.html" + }, + "cdnhwc1.com": { + "name": "华为云 CDN", + "link": "https://www.huaweicloud.com/product/cdn.html" + }, + "cdnhwc2.com": { + "name": "华为云 CDN", + "link": "https://www.huaweicloud.com/product/cdn.html" + }, + "cdnhwc3.com": { + "name": "华为云 CDN", + "link": "https://www.huaweicloud.com/product/cdn.html" + }, + "dnion.com": { + "name": "帝联科技", + "link": "http://www.dnion.com/" + }, + "ewcache.com": { + "name": "帝联科技", + "link": "http://www.dnion.com/" + }, + "globalcdn.cn": { + "name": "帝联科技", + "link": "http://www.dnion.com/" + }, + "tlgslb.com": { + "name": "帝联科技", + "link": "http://www.dnion.com/" + }, + "fastcdn.com": { + "name": "帝联科技", + "link": "http://www.dnion.com/" + }, + "flxdns.com": { + "name": "帝联科技", + "link": "http://www.dnion.com/" + }, + "dlgslb.cn": { + "name": "帝联科技", + "link": "http://www.dnion.com/" + }, + "newdefend.cn": { + "name": "牛盾云安全", + "link": "https://www.newdefend.com" + }, + "ffdns.net": { + "name": "CloudXNS", + "link": "https://www.cloudxns.net" + }, + "aocdn.com": { + "name": "可靠云 CDN (贴图库)", + "link": "http://www.kekaoyun.com/" + }, + "bsgslb.cn": { + "name": "白山云 CDN", + "link": "https://zh.baishancloud.com/" + }, + "qingcdn.com": { + "name": "白山云 CDN", + "link": "https://zh.baishancloud.com/" + }, + "bsclink.cn": { + "name": "白山云 CDN", + "link": "https://zh.baishancloud.com/" + }, + "trpcdn.net": { + "name": "白山云 CDN", + "link": "https://zh.baishancloud.com/" + }, + "anquan.io": { + "name": "牛盾云安全", + "link": "https://www.newdefend.com" + }, + "cloudglb.com": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "fastweb.com": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "fastwebcdn.com": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "cloudcdn.net": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "fwcdn.com": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "fwdns.net": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "hadns.net": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "hacdn.net": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "cachecn.com": { + "name": "快网 CDN", + "link": "http://www.fastweb.com.cn/" + }, + "qingcache.com": { + "name": "青云 CDN", + "link": "https://www.qingcloud.com/products/cdn/" + }, + "qingcloud.com": { + "name": "青云 CDN", + "link": "https://www.qingcloud.com/products/cdn/" + }, + "frontwize.com": { + "name": "青云 CDN", + "link": "https://www.qingcloud.com/products/cdn/" + }, + "msscdn.com": { + "name": "美团云 CDN", + "link": "https://www.mtyun.com/product/cdn" + }, + "800cdn.com": { + "name": "西部数码", + "link": "https://www.west.cn" + }, + "tbcache.com": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "aliyun-inc.com": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "aliyuncs.com": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "alikunlun.net": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "alikunlun.com": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "alicdn.com": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "aligaofang.com": { + "name": "阿里云盾高防", + "link": "https://www.aliyun.com/product/ddos" + }, + "yundunddos.com": { + "name": "阿里云盾高防", + "link": "https://www.aliyun.com/product/ddos" + }, + "kunlun(.*).com": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "cdngslb.com": { + "name": "阿里云 CDN", + "link": "https://www.aliyun.com/product/cdn" + }, + "yunjiasu-cdn.net": { + "name": "百度云加速", + "link": "https://su.baidu.com" + }, + "momentcdn.com": { + "name": "魔门云 CDN", + "link": "https://www.cachemoment.com" + }, + "aicdn.com": { + "name": "又拍云", + "link": "https://www.upyun.com" + }, + "qbox.me": { + "name": "七牛云", + "link": "https://www.qiniu.com" + }, + "qiniu.com": { + "name": "七牛云", + "link": "https://www.qiniu.com" + }, + "qiniudns.com": { + "name": "七牛云", + "link": "https://www.qiniu.com" + }, + "jcloudcs.com": { + "name": "京东云 CDN", + "link": "https://www.jdcloud.com/cn/products/cdn" + }, + "jdcdn.com": { + "name": "京东云 CDN", + "link": "https://www.jdcloud.com/cn/products/cdn" + }, + "qianxun.com": { + "name": "京东云 CDN", + "link": "https://www.jdcloud.com/cn/products/cdn" + }, + "jcloudlb.com": { + "name": "京东云 CDN", + "link": "https://www.jdcloud.com/cn/products/cdn" + }, + "jcloud-cdn.com": { + "name": "京东云 CDN", + "link": "https://www.jdcloud.com/cn/products/cdn" + }, + "maoyun.tv": { + "name": "猫云融合 CDN", + "link": "https://www.maoyun.tv" + }, + "xgslb.net": { + "name": "WebLuker (蓝汛)", + "link": "http://www.webluker.com" + }, + "ucloud.cn": { + "name": "UCloud CDN", + "link": "https://www.ucloud.cn/site/product/ucdn.html" + }, + "ucloud.com.cn": { + "name": "UCloud CDN", + "link": "https://www.ucloud.cn/site/product/ucdn.html" + }, + "cdndo.com": { + "name": "UCloud CDN", + "link": "https://www.ucloud.cn/site/product/ucdn.html" + }, + "zenlogic.net": { + "name": "Zenlayer CDN", + "link": "https://www.zenlayer.com" + }, + "ogslb.com": { + "name": "Zenlayer CDN", + "link": "https://www.zenlayer.com" + }, + "uxengine.net": { + "name": "Zenlayer CDN", + "link": "https://www.zenlayer.com" + }, + "tan14.net": { + "name": "TAN14 CDN", + "link": "http://www.tan14.cn/" + }, + "verycloud.cn": { + "name": "VeryCloud 云分发", + "link": "https://www.verycloud.cn/" + }, + "verycdn.net": { + "name": "VeryCloud 云分发", + "link": "https://www.verycloud.cn/" + }, + "verygslb.com": { + "name": "VeryCloud 云分发", + "link": "https://www.verycloud.cn/" + }, + "xundayun.cn": { + "name": "SpeedyCloud CDN", + "link": "https://www.speedycloud.cn/zh/Products/CDN/CloudDistribution.html" + }, + "xundayun.com": { + "name": "SpeedyCloud CDN", + "link": "https://www.speedycloud.cn/zh/Products/CDN/CloudDistribution.html" + }, + "speedycloud.cc": { + "name": "SpeedyCloud CDN", + "link": "https://www.speedycloud.cn/zh/Products/CDN/CloudDistribution.html" + }, + "mucdn.net": { + "name": "Verizon CDN (Edgecast)", + "link": "https://www.verizondigitalmedia.com/platform/edgecast-cdn/" + }, + "alphacdn.net": { + "name": "Verizon CDN (Edgecast)", + "link": "https://www.verizondigitalmedia.com/platform/edgecast-cdn/" + }, + "systemcdn.net": { + "name": "Verizon CDN (Edgecast)", + "link": "https://www.verizondigitalmedia.com/platform/edgecast-cdn/" + }, + "edgecastcdn.net": { + "name": "Verizon CDN (Edgecast)", + "link": "https://www.verizondigitalmedia.com/platform/edgecast-cdn/" + }, + "coding.io": { + "name": "Coding Pages", + "link": "https://coding.net/pages" + }, + "coding.me": { + "name": "Coding Pages", + "link": "https://coding.net/pages" + }, + "gitlab.io": { + "name": "GitLab Pages", + "link": "https://docs.gitlab.com/ee/user/project/pages/" + }, + "github.io": { + "name": "GitHub Pages", + "link": "https://pages.github.com/" + }, + "herokuapp.com": { + "name": "Heroku SaaS", + "link": "https://www.heroku.com" + }, + "googleapis.com": { + "name": "Google Cloud Storage", + "link": "https://cloud.google.com/storage/" + }, + "netdna.com": { + "name": "Stackpath (原 MaxCDN)", + "link": "https://www.stackpath.com/maxcdn/" + }, + "netdna-cdn.com": { + "name": "Stackpath (原 MaxCDN)", + "link": "https://www.stackpath.com/maxcdn/" + }, + "netdna-ssl.com": { + "name": "Stackpath (原 MaxCDN)", + "link": "https://www.stackpath.com/maxcdn/" + }, + "cdntip.com": { + "name": "腾讯云 CDN", + "link": "https://cloud.tencent.com/product/cdn-scd" + }, + "dnsv1.com": { + "name": "腾讯云 CDN", + "link": "https://cloud.tencent.com/product/cdn-scd" + }, + "tencdns.net": { + "name": "腾讯云 CDN", + "link": "https://cloud.tencent.com/product/cdn-scd" + }, + "dayugslb.com": { + "name": "腾讯云大禹 BGP 高防", + "link": "https://cloud.tencent.com/product/ddos-advanced" + }, + "tcdnvod.com": { + "name": "腾讯云视频 CDN", + "link": "https://lab.skk.moe/cdn" + }, + "tdnsv5.com": { + "name": "腾讯云 CDN", + "link": "https://cloud.tencent.com/product/cdn-scd" + }, + "ksyuncdn.com": { + "name": "金山云 CDN", + "link": "https://www.ksyun.com/post/product/CDN" + }, + "ks-cdn.com": { + "name": "金山云 CDN", + "link": "https://www.ksyun.com/post/product/CDN" + }, + "ksyuncdn-k1.com": { + "name": "金山云 CDN", + "link": "https://www.ksyun.com/post/product/CDN" + }, + "netlify.com": { + "name": "Netlify", + "link": "https://www.netlify.com" + }, + "zeit.co": { + "name": "ZEIT Now Smart CDN", + "link": "https://zeit.co" + }, + "zeit-cdn.net": { + "name": "ZEIT Now Smart CDN", + "link": "https://zeit.co" + }, + "b-cdn.net": { + "name": "Bunny CDN", + "link": "https://bunnycdn.com/" + }, + "lsycdn.com": { + "name": "蓝视云 CDN", + "link": "https://cloud.lsy.cn/" + }, + "scsdns.com": { + "name": "逸云科技云加速 CDN", + "link": "http://www.exclouds.com/navPage/wise" + }, + "quic.cloud": { + "name": "QUIC.Cloud", + "link": "https://quic.cloud/" + }, + "flexbalancer.net": { + "name": "FlexBalancer - Smart Traffic Routing", + "link": "https://perfops.net/flexbalancer" + }, + "gcdn.co": { + "name": "G - Core Labs", + "link": "https://gcorelabs.com/cdn/" + }, + "sangfordns.com": { + "name": "深信服 AD 系列应用交付产品 单边加速解决方案", + "link": "http://www.sangfor.com.cn/topic/2011adn/solutions5.html" + }, + "stspg-customer.com": { + "name": "StatusPage.io", + "link": "https://www.statuspage.io" + }, + "turbobytes.net": { + "name": "TurboBytes Multi-CDN", + "link": "https://www.turbobytes.com" + }, + "turbobytes-cdn.com": { + "name": "TurboBytes Multi-CDN", + "link": "https://www.turbobytes.com" + }, + "att-dsa.net": { + "name": "AT&T Content Delivery Network", + "link": "https://www.business.att.com/products/cdn.html" + }, + "azioncdn.net": { + "name": "Azion Tech | Edge Computing PLatform", + "link": "https://www.azion.com" + }, + "belugacdn.com": { + "name": "BelugaCDN", + "link": "https://www.belugacdn.com" + }, + "cachefly.net": { + "name": "CacheFly CDN", + "link": "https://www.cachefly.com/" + }, + "inscname.net": { + "name": "Instart CDN", + "link": "https://www.instart.com/products/web-performance/cdn" + }, + "insnw.net": { + "name": "Instart CDN", + "link": "https://www.instart.com/products/web-performance/cdn" + }, + "internapcdn.net": { + "name": "Internap CDN", + "link": "https://www.inap.com/network/content-delivery-network" + }, + "footprint.net": { + "name": "CenturyLink CDN (原 Level 3)", + "link": "https://www.centurylink.com/business/networking/cdn.html" + }, + "llnwi.net": { + "name": "Limelight Network", + "link": "https://www.limelight.com" + }, + "llnwd.net": { + "name": "Limelight Network", + "link": "https://www.limelight.com" + }, + "unud.net": { + "name": "Limelight Network", + "link": "https://www.limelight.com" + }, + "lldns.net": { + "name": "Limelight Network", + "link": "https://www.limelight.com" + }, + "stackpathdns.com": { + "name": "Stackpath CDN", + "link": "https://www.stackpath.com" + }, + "stackpathcdn.com": { + "name": "Stackpath CDN", + "link": "https://www.stackpath.com" + }, + "mncdn.com": { + "name": "Medianova", + "link": "https://www.medianova.com" + }, + "rncdn1.com": { + "name": "Relected Networks", + "link": "https://reflected.net/globalcdn" + }, + "simplecdn.net": { + "name": "Relected Networks", + "link": "https://reflected.net/globalcdn" + }, + "swiftserve.com": { + "name": "Conversant - SwiftServe CDN", + "link": "https://reflected.net/globalcdn" + }, + "bitgravity.com": { + "name": "Tata communications CDN", + "link": "https://cdn.tatacommunications.com" + }, + "zenedge.net": { + "name": "Oracle Dyn Web Application Security suite (原 Zenedge CDN)", + "link": "https://cdn.tatacommunications.com" + }, + "biliapi.com": { + "name": "Bilibili 业务 GSLB", + "link": "https://lab.skk.moe/cdn" + }, + "hdslb.net": { + "name": "Bilibili 高可用负载均衡", + "link": "https://github.com/bilibili/overlord" + }, + "hdslb.com": { + "name": "Bilibili 高可用地域负载均衡", + "link": "https://github.com/bilibili/overlord" + }, + "xwaf.cn": { + "name": "极御云安全(浙江壹云云计算有限公司)", + "link": "https://www.stopddos.cn" + }, + "shifen.com": { + "name": "百度旗下业务地域负载均衡系统", + "link": "https://lab.skk.moe/cdn" + }, + "sinajs.cn": { + "name": "新浪静态域名", + "link": "https://lab.skk.moe/cdn" + }, + "tencent-cloud.net": { + "name": "腾讯旗下业务地域负载均衡系统", + "link": "https://lab.skk.moe/cdn" + }, + "elemecdn.com": { + "name": "饿了么静态域名与地域负载均衡", + "link": "https://lab.skk.moe/cdn" + }, + "sinaedge.com": { + "name": "新浪科技融合CDN负载均衡", + "link": "https://lab.skk.moe/cdn" + }, + "sina.com.cn": { + "name": "新浪科技融合CDN负载均衡", + "link": "https://lab.skk.moe/cdn" + }, + "sinacdn.com": { + "name": "新浪云 CDN", + "link": "https://www.sinacloud.com/doc/sae/php/cdn.html" + }, + "sinasws.com": { + "name": "新浪云 CDN", + "link": "https://www.sinacloud.com/doc/sae/php/cdn.html" + }, + "saebbs.com": { + "name": "新浪云 SAE 云引擎", + "link": "https://www.sinacloud.com/doc/sae/php/cdn.html" + }, + "websitecname.cn": { + "name": "美橙互联旗下建站之星", + "link": "https://www.sitestar.cn" + }, + "cdncenter.cn": { + "name": "美橙互联CDN", + "link": "https://www.cndns.com" + }, + "vhostgo.com": { + "name": "西部数码虚拟主机", + "link": "https://www.west.cn" + }, + "jsd.cc": { + "name": "上海云盾YUNDUN", + "link": "https://www.yundun.com" + }, + "powercdn.cn": { + "name": "动力在线CDN", + "link": "http://www.powercdn.com" + }, + "21vokglb.cn": { + "name": "世纪互联云快线业务", + "link": "https://www.21vianet.com" + }, + "21vianet.com.cn": { + "name": "世纪互联云快线业务", + "link": "https://www.21vianet.com" + }, + "21okglb.cn": { + "name": "世纪互联云快线业务", + "link": "https://www.21vianet.com" + }, + "21speedcdn.com": { + "name": "世纪互联云快线业务", + "link": "https://www.21vianet.com" + }, + "21cvcdn.com": { + "name": "世纪互联云快线业务", + "link": "https://www.21vianet.com" + }, + "okcdn.com": { + "name": "世纪互联云快线业务", + "link": "https://www.21vianet.com" + }, + "okglb.com": { + "name": "世纪互联云快线业务", + "link": "https://www.21vianet.com" + }, + "cdnetworks.net": { + "name": "北京同兴万点网络技术", + "link": "http://www.txnetworks.cn/" + }, + "txnetworks.cn": { + "name": "北京同兴万点网络技术", + "link": "http://www.txnetworks.cn/" + }, + "cdnnetworks.com": { + "name": "北京同兴万点网络技术", + "link": "http://www.txnetworks.cn/" + }, + "txcdn.cn": { + "name": "北京同兴万点网络技术", + "link": "http://www.txnetworks.cn/" + }, + "cdnunion.net": { + "name": "宝腾互联旗下上海万根网络(CDN 联盟)", + "link": "http://www.cdnunion.com" + }, + "cdnunion.com": { + "name": "宝腾互联旗下上海万根网络(CDN 联盟)", + "link": "http://www.cdnunion.com" + }, + "mygslb.com": { + "name": "宝腾互联旗下上海万根网络(YaoCDN)", + "link": "http://www.vangen.cn" + }, + "cdnudns.com": { + "name": "宝腾互联旗下上海万根网络(YaoCDN)", + "link": "http://www.vangen.cn" + }, + "sprycdn.com": { + "name": "宝腾互联旗下上海万根网络(YaoCDN)", + "link": "http://www.vangen.cn" + }, + "chuangcdn.com": { + "name": "创世云融合 CDN", + "link": "https://www.chuangcache.com/index.html" + }, + "aocde.com": { + "name": "创世云融合 CDN", + "link": "https://www.chuangcache.com" + }, + "ctxcdn.cn": { + "name": "中国电信天翼云CDN", + "link": "https://www.ctyun.cn/product2/#/product/10027560" + }, + "yfcdn.net": { + "name": "云帆加速CDN", + "link": "https://www.yfcloud.com" + }, + "mmycdn.cn": { + "name": "蛮蛮云 CDN(中联利信)", + "link": "https://www.chinamaincloud.com/cloudDispatch.html" + }, + "chinamaincloud.com": { + "name": "蛮蛮云 CDN(中联利信)", + "link": "https://www.chinamaincloud.com/cloudDispatch.html" + }, + "cnispgroup.com": { + "name": "中联数据(中联利信)", + "link": "http://www.cnispgroup.com/" + }, + "cdnle.com": { + "name": "新乐视云联(原乐视云)CDN", + "link": "http://www.lecloud.com/zh-cn" + }, + "gosuncdn.com": { + "name": "高升控股CDN技术", + "link": "http://www.gosun.com" + }, + "mmtrixopt.com": { + "name": "mmTrix性能魔方(高升控股旗下)", + "link": "http://www.mmtrix.com" + }, + "cloudfence.cn": { + "name": "蓝盾云CDN", + "link": "https://www.cloudfence.cn/#/cloudWeb/yaq/yaqyfx" + }, + "ngaagslb.cn": { + "name": "新流云(新流万联)", + "link": "https://www.ngaa.com.cn" + }, + "p2cdn.com": { + "name": "星域云P2P CDN", + "link": "https://www.xycloud.com" + }, + "00cdn.com": { + "name": "星域云P2P CDN", + "link": "https://www.xycloud.com" + }, + "sankuai.com": { + "name": "美团云(三快科技)负载均衡", + "link": "https://www.mtyun.com" + }, + "lccdn.org": { + "name": "领智云 CDN(杭州领智云画)", + "link": "http://www.linkingcloud.com" + }, + "nscloudwaf.com": { + "name": "绿盟云 WAF", + "link": "https://cloud.nsfocus.com" + }, + "2cname.com": { + "name": "网堤安全", + "link": "https://www.ddos.com" + }, + "ucloudgda.com": { + "name": "UCloud 罗马 Rome 全球网络加速", + "link": "https://www.ucloud.cn/site/product/rome.html" + }, + "google.com": { + "name": "Google Web 业务", + "link": "https://lab.skk.moe/cdn" + }, + "1e100.net": { + "name": "Google Web 业务", + "link": "https://lab.skk.moe/cdn" + }, + "ncname.com": { + "name": "NodeCache", + "link": "https://www.nodecache.com" + }, + "alipaydns.com": { + "name": "蚂蚁金服旗下业务地域负载均衡系统", + "link": "https://lab.skk.moe/cdn/" + }, + "wscloudcdn.com": { + "name": "全速云(网宿)CloudEdge 云加速", + "link": "https://www.quansucloud.com/product.action?product.id=270" + } +} \ No newline at end of file diff --git a/internal/app/cdn.go b/internal/app/cdn.go new file mode 100644 index 0000000..0f22892 --- /dev/null +++ b/internal/app/cdn.go @@ -0,0 +1,93 @@ +package app + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + "regexp" + "strings" + + "github.com/zu1k/nali/constant" + + "github.com/zu1k/nali/pkg/cdn" +) + +var ( + cdnDB cdn.CDN + domainRe *regexp.Regexp +) + +func init() { + domainRe = regexp.MustCompile(`[0-9A-Za-z]{2,}\.[0-9A-Za-z]{2,3}\.[0-9A-Za-z]{2,3}|[0-9A-Za-z]{2,}\.[0-9A-Za-z]{2,3}`) +} + +func InitCDNDB() { + cdnDB = cdn.NewCDN(filepath.Join(constant.HomePath, "cdn.json")) +} + +func ParseCDNs(str []string) { + for _, cname := range str { + name := find(cname) + fmt.Printf("%s [%s]\n", cname, name) + } +} + +func find(cname string) string { + baseCname := parseBaseCname(cname) + if baseCname == "" { + return "无法解析" + } + cdnResult, found := cdnDB.Data[baseCname] + if found { + return cdnResult.Name + } + return "未找到" +} + +func ReplaceCDNInString(str string) (result string) { + cnames := domainRe.FindAllString(str, -1) + result = str + for _, cname := range cnames { + name := find(cname) + if name != "未找到" && name != "无法解析" { + result = strings.ReplaceAll(result, cname, fmt.Sprintf("%s [%s]", cname, name)) + } + } + return +} + +func parseBaseCname(domain string) string { + hostParts := strings.Split(domain, ".") + if len(hostParts) < 2 { + return domain + } + baseCname := hostParts[len(hostParts)-2] + "." + hostParts[len(hostParts)-1] + return baseCname +} + +func UpdateDB() { + filePath := filepath.Join(constant.HomePath, "cdn.json") + + log.Println("正在下载最新 CDN数据库...") + tmpData, err := cdn.Download() + if err != nil { + log.Fatalln("下载失败", err.Error()) + return + } + + // 文件存在就删除 + _, err = os.Stat(filePath) + if err == nil { + err = os.Remove(filePath) + if err != nil { + log.Fatalln("旧文件删除失败", err.Error()) + os.Exit(1) + } + } + + if err := ioutil.WriteFile(filePath, tmpData, 0644); err == nil { + log.Printf("已将最新的CDN数据库保存到本地 %s ", filePath) + } +} diff --git a/pkg/cdn/cdn.go b/pkg/cdn/cdn.go new file mode 100644 index 0000000..8704f14 --- /dev/null +++ b/pkg/cdn/cdn.go @@ -0,0 +1,56 @@ +package cdn + +import ( + "encoding/json" + "io/ioutil" + "log" + "os" +) + +type CDN struct { + Data CDNDist +} + +type CDNDist map[string]CDNResult + +type CDNResult struct { + Name string `json:"name"` + Link string `json:"link"` +} + +func NewCDN(filePath string) CDN { + cdnDist := make(CDNDist) + cdnData := make([]byte, 0) + + // 判断文件是否存在 + _, err := os.Stat(filePath) + if err != nil && os.IsNotExist(err) { + log.Println("文件不存在,尝试从网络获取最新CDN数据库") + cdnData, err = Download() + if err != nil { + panic(err) + } else { + if err := ioutil.WriteFile(filePath, cdnData, 0644); err == nil { + log.Printf("已将最新的 CDN数据库 保存到本地: %s ", filePath) + } + } + } else { + // 打开文件句柄 + cdnFile, err := os.OpenFile(filePath, os.O_RDONLY, 0400) + if err != nil { + panic(err) + } + defer cdnFile.Close() + + cdnData, err = ioutil.ReadAll(cdnFile) + if err != nil { + panic(err) + } + } + + err = json.Unmarshal(cdnData, &cdnDist) + if err != nil { + panic("cdn data parse failed!") + } + return CDN{Data: cdnDist} +} diff --git a/pkg/cdn/update.go b/pkg/cdn/update.go new file mode 100644 index 0000000..619f9f9 --- /dev/null +++ b/pkg/cdn/update.go @@ -0,0 +1,21 @@ +package cdn + +import ( + "io/ioutil" + "net/http" +) + +func Download() (data []byte, err error) { + //resp, err := http.Get("https://raw.githubusercontent.com/SukkaLab/cdn/master/dist/cdn.json") + resp, err := http.Get("https://cdn.jsdelivr.net/gh/SukkaLab/cdn/dist/cdn.json") + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + return body, nil +} diff --git a/pkg/common/struct.go b/pkg/common/struct.go index 1669509..58849a3 100644 --- a/pkg/common/struct.go +++ b/pkg/common/struct.go @@ -2,8 +2,8 @@ package common import "os" -// FileInfo: info of db file -type FileInfo struct { +// FileData: info of db file +type FileData struct { Data []byte FilePath string FileBase *os.File @@ -11,7 +11,7 @@ type FileInfo struct { // IPDB common ip database type IPDB struct { - Data *FileInfo + Data *FileData Offset uint32 ItemLen uint32 IndexLen uint32 diff --git a/pkg/qqwry/qqwry.go b/pkg/qqwry/qqwry.go index ae75b32..607e778 100644 --- a/pkg/qqwry/qqwry.go +++ b/pkg/qqwry/qqwry.go @@ -20,7 +20,7 @@ type QQwry struct { // NewQQwry new db from path func NewQQwry(filePath string) QQwry { var fileData []byte - var fileInfo common.FileInfo + var fileInfo common.FileData // 判断文件是否存在 _, err := os.Stat(filePath) diff --git a/pkg/zxipv6wry/zxipv6wry.go b/pkg/zxipv6wry/zxipv6wry.go index a68ddd6..963cac6 100644 --- a/pkg/zxipv6wry/zxipv6wry.go +++ b/pkg/zxipv6wry/zxipv6wry.go @@ -18,7 +18,7 @@ type ZXwry struct { func NewZXwry(filePath string) ZXwry { var tmpData []byte - var fileInfo common.FileInfo + var fileInfo common.FileData // 判断文件是否存在 _, err := os.Stat(filePath)