func setupNetworkConnection(xdebugAddr string, ideAddr string, log *logger.Logger) (*net.TCPAddr, *net.TCPAddr, *net.TCPListener) { laddr, err := net.ResolveTCPAddr("tcp", xdebugAddr) errorhandler.PanicHandling(err, log) raddr, err := net.ResolveTCPAddr("tcp", ideAddr) errorhandler.PanicHandling(err, log) listener, err := net.ListenTCP("tcp", laddr) errorhandler.PanicHandling(err, log) return laddr, raddr, listener }
func (p *PathMapper) readOriginalPathFromCache(path string) string { dat, err := ioutil.ReadFile(path) errorhandler.PanicHandling(err) r := regexp.MustCompile(`(?m)^# PathAndFilename: (.*)$`) match := r.FindStringSubmatch(string(dat)) //todo check if the match contain something originalPath := match[1] if p.Config.VeryVerbose { logger.Info("Umpa Lumpa need to work harder, need to reverse this one\n>>> %s\n>>> %s\n", logger.Colorize(fmt.Sprintf(h, path), "yellow"), logger.Colorize(fmt.Sprintf(h, originalPath), "green")) } p.registerPathMapping(path, originalPath) return originalPath }
// ApplyMappingToXML change file path in xDebug XML protocol func (p *PathMapper) ApplyMappingToXML(message []byte) []byte { message = p.doXMLPathMapping(message) // update xml length count s := strings.Split(string(message), "\x00") i, err := strconv.Atoi(s[0]) errorhandler.PanicHandling(err, p.logger) l := len(s[1]) if i != l { message = bytes.Replace(message, []byte(strconv.Itoa(i)), []byte(strconv.Itoa(l)), 1) } return message }
//ApplyMappingToXML change file path in xDebug XML protocol func (p *PathMapper) ApplyMappingToXML(xml []byte) []byte { xml = p.doXmlPathMapping(xml) //update xml length count s := strings.Split(string(xml), "\x00") i, err := strconv.Atoi(s[0]) errorhandler.PanicHandling(err) l := len(s[1]) if i != l { xml = bytes.Replace(xml, []byte(strconv.Itoa(i)), []byte(strconv.Itoa(l)), 1) } return xml }
func (p *PathMapper) readOriginalPathFromCache(path string) string { dat, err := ioutil.ReadFile(path) errorhandler.PanicHandling(err, p.logger) match := regexpPathAndFilename.FindStringSubmatch(string(dat)) p.logger.Debug("readOriginalPathFromCache %s", path) if len(match) == 2 { originalPath := match[1] if p.config.VeryVerbose { p.logger.Info("Umpa Lumpa need to work harder, need to reverse this one\n>>> %s\n>>> %s\n", p.logger.Colorize(fmt.Sprintf(h, path), "yellow"), p.logger.Colorize(fmt.Sprintf(h, originalPath), "green")) } p.logger.Debug("readOriginalPathFromCache %s >>> %s", path, originalPath) p.setPathMapping(path, originalPath) return originalPath } return path }
func (p *PathMapper) registerPathMapping(path string, originalPath string) string { dat, err := ioutil.ReadFile(path) errorhandler.PanicHandling(err) //check if file contains flow annotation if strings.Contains(string(dat), "@Flow\\") { if p.Config.Verbose { logger.Info("%s", "Our Umpa Lumpa take care of your mapping and they did a great job, they found a proxy for you:") logger.Info(">>> %s\n", path) } if _, exist := mapping[path]; exist == false { mapping[path] = originalPath } return path } return originalPath }
func main() { app := cli.NewApp() app.Name = "flow-debugproxy" app.Usage = "Flow Framework xDebug proxy" app.Author = "Dominique Feyer" app.Email = "*****@*****.**" app.Version = "0.9.0" app.Flags = []cli.Flag{ cli.StringFlag{ Name: "xdebug, l", Value: "127.0.0.1:9000", Usage: "Listen address IP and port number", }, cli.StringFlag{ Name: "ide, I", Value: "127.0.0.1:9010", Usage: "Bind address IP and port number", }, cli.StringFlag{ Name: "context, c", Value: "Development", Usage: "The context to run as", }, cli.StringFlag{ Name: "framework", Value: "flow", Usage: "Framework support, currently on Flow framework (flow) or Dummy (dummy) is supported", }, cli.BoolFlag{ Name: "verbose", Usage: "Verbose", }, cli.BoolFlag{ Name: "vv", Usage: "Very verbose", }, cli.BoolFlag{ Name: "debug", Usage: "Show debug output", }, } app.Action = func(cli *cli.Context) { c := &config.Config{ Context: cli.String("context"), Framework: cli.String("framework"), Verbose: cli.Bool("verbose") || cli.Bool("vv"), VeryVerbose: cli.Bool("vv"), Debug: cli.Bool("debug"), } log := &logger.Logger{ Config: c, } laddr, raddr, listener := setupNetworkConnection(cli.String("xdebug"), cli.String("ide"), log) log.Info("Debugger from %v\nIDE from %v\n", laddr, raddr) pathMapping := &pathmapping.PathMapping{} pathMapper, err := pathmapperfactory.Create(c, pathMapping, log) errorhandler.PanicHandling(err, log) for { conn, err := listener.AcceptTCP() if err != nil { log.Warn("Failed to accept connection '%s'\n", err) continue } proxy := &xdebugproxy.Proxy{ Lconn: conn, Raddr: raddr, PathMapper: pathMapper, Config: c, } go proxy.Start() } } app.Run(os.Args) }