update
							parent
							
								
									36d32e7222
								
							
						
					
					
						commit
						676aa5bdcb
					
				|  | @ -5,6 +5,7 @@ import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"git.makemake.in/kzkzzzz/mycommon/mylog" | 	"git.makemake.in/kzkzzzz/mycommon/mylog" | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"log" | ||||||
| 	"math/rand" | 	"math/rand" | ||||||
| 	"net" | 	"net" | ||||||
| 	"time" | 	"time" | ||||||
|  | @ -61,7 +62,7 @@ func (t *TCP) Forward() error { | ||||||
| 	//listener, err := lc.Listen(ctx0, "tcp", t.forwardInfo.LocalAddr)
 | 	//listener, err := lc.Listen(ctx0, "tcp", t.forwardInfo.LocalAddr)
 | ||||||
| 	// 启动 TCP 监听
 | 	// 启动 TCP 监听
 | ||||||
| 
 | 
 | ||||||
| 	mylog.Infof("[TCP] %s %s -> %s", t.forwardInfo.Name, t.forwardInfo.LocalAddr, t.forwardInfo.TargetAddr) | 	log.Printf("[TCP] [%s] %s -> %s", t.forwardInfo.Name, t.forwardInfo.LocalAddr, t.forwardInfo.TargetAddr) | ||||||
| 
 | 
 | ||||||
| 	go func() { | 	go func() { | ||||||
| 		ctx, cancelCtx := context.WithCancel(context.Background()) | 		ctx, cancelCtx := context.WithCancel(context.Background()) | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ package forward | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"git.makemake.in/kzkzzzz/mycommon/mylog" | 	"git.makemake.in/kzkzzzz/mycommon/mylog" | ||||||
|  | 	"log" | ||||||
| 	"math/rand" | 	"math/rand" | ||||||
| 	"net" | 	"net" | ||||||
| 	"time" | 	"time" | ||||||
|  | @ -36,7 +37,7 @@ func (u *UDP) Forward() error { | ||||||
| 	} | 	} | ||||||
| 	u.conn = conn | 	u.conn = conn | ||||||
| 
 | 
 | ||||||
| 	mylog.Infof("[UDP] %s %s -> %s", u.forwardInfo.Name, u.forwardInfo.LocalAddr, u.forwardInfo.TargetAddr) | 	log.Printf("[UDP] [%s] %s -> %s", u.forwardInfo.Name, u.forwardInfo.LocalAddr, u.forwardInfo.TargetAddr) | ||||||
| 
 | 
 | ||||||
| 	go func() { | 	go func() { | ||||||
| 		err := u.handleConn(conn) | 		err := u.handleConn(conn) | ||||||
|  |  | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -3,8 +3,8 @@ | ||||||
|   <head> |   <head> | ||||||
|     <meta charset="UTF-8"> |     <meta charset="UTF-8"> | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|     <title>端口转发配置</title> |     <title>端口转发</title> | ||||||
|     <script type="module" crossorigin src="./assets/index-51cHkXnS.js"></script> |     <script type="module" crossorigin src="./assets/index-JzuN2dGn.js"></script> | ||||||
|     <link rel="stylesheet" crossorigin href="./assets/index-BA8XwqWY.css"> |     <link rel="stylesheet" crossorigin href="./assets/index-BA8XwqWY.css"> | ||||||
|   </head> |   </head> | ||||||
|   <body> |   <body> | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ import ( | ||||||
| 	enTr "github.com/go-playground/validator/v10/translations/en" | 	enTr "github.com/go-playground/validator/v10/translations/en" | ||||||
| 	"github.com/spf13/cast" | 	"github.com/spf13/cast" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
|  | 	"log" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/netip" | 	"net/netip" | ||||||
| 	"proxyport/app/db" | 	"proxyport/app/db" | ||||||
|  | @ -30,6 +31,7 @@ type Cfg struct { | ||||||
| 	ListenAddr string | 	ListenAddr string | ||||||
| 	User       string | 	User       string | ||||||
| 	Password   string | 	Password   string | ||||||
|  | 	WebName    string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Start(ctx context.Context) { | func Start(ctx context.Context) { | ||||||
|  | @ -49,6 +51,8 @@ func Start(ctx context.Context) { | ||||||
| 	engine.GET("/", func(ctx *gin.Context) { | 	engine.GET("/", func(ctx *gin.Context) { | ||||||
| 		ctx.HTML(http.StatusOK, "index.html", nil) | 		ctx.HTML(http.StatusOK, "index.html", nil) | ||||||
| 	}) | 	}) | ||||||
|  | 
 | ||||||
|  | 	engine.GET("/GetConfig", GetConfig) | ||||||
| 	engine.GET("/List", List) | 	engine.GET("/List", List) | ||||||
| 	engine.POST("/Create", Create) | 	engine.POST("/Create", Create) | ||||||
| 	engine.POST("/Update", Update) | 	engine.POST("/Update", Update) | ||||||
|  | @ -61,7 +65,7 @@ func Start(ctx context.Context) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	go func() { | 	go func() { | ||||||
| 		mylog.Infof("http listen on %s", hs.Addr) | 		log.Printf("http listen on %s", hs.Addr) | ||||||
| 		mylog.Warn(hs.ListenAndServe()) | 		mylog.Warn(hs.ListenAndServe()) | ||||||
| 	}() | 	}() | ||||||
| 
 | 
 | ||||||
|  | @ -85,6 +89,12 @@ func cors() gin.HandlerFunc { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func GetConfig(ctx *gin.Context) { | ||||||
|  | 	success(ctx, gin.H{ | ||||||
|  | 		"web_name": Config.WebName, | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func List(ctx *gin.Context) { | func List(ctx *gin.Context) { | ||||||
| 	data := make([]*model.Forward, 0) | 	data := make([]*model.Forward, 0) | ||||||
| 
 | 
 | ||||||
|  | @ -271,7 +281,7 @@ func Delete(ctx *gin.Context) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	hostReg   = regexp.MustCompile(`^[a-zA-Z0-9]+[a-zA-Z0-9.]*[a-zA-Z]+$`) | 	hostReg   = regexp.MustCompile(`^[a-zA-Z0-9]+[a-zA-Z0-9\-.]*[a-zA-Z]+$`) | ||||||
| 	letterReg = regexp.MustCompile(`[a-zA-Z\-]`) | 	letterReg = regexp.MustCompile(`[a-zA-Z\-]`) | ||||||
| 	emptyReg  = regexp.MustCompile(`\s+`) | 	emptyReg  = regexp.MustCompile(`\s+`) | ||||||
| ) | ) | ||||||
|  | @ -284,6 +294,11 @@ func checkAddr(addr string) error { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	sp := strings.SplitN(addr, ":", 2) | 	sp := strings.SplitN(addr, ":", 2) | ||||||
|  | 
 | ||||||
|  | 	if len(sp) != 2 { | ||||||
|  | 		return fmt.Errorf("addr format err: %s", addr) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	host := sp[0] | 	host := sp[0] | ||||||
| 	port := sp[1] | 	port := sp[1] | ||||||
| 	intPort := cast.ToInt(port) | 	intPort := cast.ToInt(port) | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
|   <head> |   <head> | ||||||
|     <meta charset="UTF-8"> |     <meta charset="UTF-8"> | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|     <title>端口转发配置</title> |     <title>端口转发</title> | ||||||
|   </head> |   </head> | ||||||
|   <body> |   <body> | ||||||
|     <div id="app"></div> |     <div id="app"></div> | ||||||
|  |  | ||||||
|  | @ -1,7 +1,9 @@ | ||||||
| <template> | <template> | ||||||
|   <div> |   <div> | ||||||
|     <div> |     <div> | ||||||
|       <h2>端口转发</h2> |       <h2> | ||||||
|  |         <span>{{ data.title }}</span> | ||||||
|  |       </h2> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|     <div style="width: 100%;"> |     <div style="width: 100%;"> | ||||||
|  | @ -35,7 +37,7 @@ | ||||||
| 
 | 
 | ||||||
|         <el-table-column align="center" label="远程地址"> |         <el-table-column align="center" label="远程地址"> | ||||||
|           <template #default="scope"> |           <template #default="scope"> | ||||||
|             <div style="white-space: pre">{{ formatList(scope.row.target_addr) }}</div> |             <div style="white-space: pre-wrap; word-break: break-all">{{ formatList(scope.row.target_addr) }}</div> | ||||||
|           </template> |           </template> | ||||||
|         </el-table-column> |         </el-table-column> | ||||||
| 
 | 
 | ||||||
|  | @ -110,17 +112,31 @@ import {onMounted, reactive} from "vue"; | ||||||
| import http from "@/helper/http.js"; | import http from "@/helper/http.js"; | ||||||
| 
 | 
 | ||||||
| const data = reactive({ | const data = reactive({ | ||||||
|  |   title: "端口转发", | ||||||
|   list: [], |   list: [], | ||||||
|   dialogVisible: false, |   dialogVisible: false, | ||||||
|   form: { |   form: { | ||||||
|     protocol: 0, |     protocol: 0, | ||||||
|   } |   }, | ||||||
|  |   config: {} | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| onMounted(() => { | onMounted(() => { | ||||||
|  |   getConfig() | ||||||
|   getList() |   getList() | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  | const getConfig =  async () => { | ||||||
|  |   let res = await http.get("/GetConfig") | ||||||
|  |   data.config = res.data.data | ||||||
|  | 
 | ||||||
|  |   if (data.config.web_name !== "") { | ||||||
|  |     data.title = `端口转发 - ${data.config.web_name}` | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   document.title = data.title | ||||||
|  | } | ||||||
|  | 
 | ||||||
| const createForward = () => { | const createForward = () => { | ||||||
|   data.dialogVisible = true |   data.dialogVisible = true | ||||||
|   data.form = { |   data.form = { | ||||||
|  | @ -177,7 +193,7 @@ const getList = async () => { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   console.log(res) |   // console.log(res) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const confirmConfig = async () => { | const confirmConfig = async () => { | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								main.go
								
								
								
								
							
							
						
						
									
										3
									
								
								main.go
								
								
								
								
							|  | @ -4,6 +4,7 @@ import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"flag" | 	"flag" | ||||||
| 	"git.makemake.in/kzkzzzz/mycommon/mylog" | 	"git.makemake.in/kzkzzzz/mycommon/mylog" | ||||||
|  | 	"log" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/signal" | 	"os/signal" | ||||||
| 	"proxyport/app/db" | 	"proxyport/app/db" | ||||||
|  | @ -18,10 +19,12 @@ var ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
|  | 	log.SetOutput(os.Stdout) | ||||||
| 	flag.StringVar(&logLevel, "log_level", "debug", "log level") | 	flag.StringVar(&logLevel, "log_level", "debug", "log level") | ||||||
| 	flag.StringVar(&web.Config.ListenAddr, "listen_addr", ":28083", "web port") | 	flag.StringVar(&web.Config.ListenAddr, "listen_addr", ":28083", "web port") | ||||||
| 	flag.StringVar(&web.Config.User, "user", "", "web user") | 	flag.StringVar(&web.Config.User, "user", "", "web user") | ||||||
| 	flag.StringVar(&web.Config.Password, "password", "", "web password") | 	flag.StringVar(&web.Config.Password, "password", "", "web password") | ||||||
|  | 	flag.StringVar(&web.Config.WebName, "web_name", "", "web name") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
| 
 | 
 | ||||||
| 	mylog.SetLogLevel(logLevel) | 	mylog.SetLogLevel(logLevel) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue