From 59cde13c2406b586066a315ade1e57608334c2ee Mon Sep 17 00:00:00 2001 From: Davincible Date: Fri, 10 Feb 2023 15:23:26 +0100 Subject: [PATCH 1/2] fix: add OS check to pdeathsig --- chrome.go | 14 ++++++++++---- display.go | 45 ++++++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/chrome.go b/chrome.go index 525f746..a6449e8 100644 --- a/chrome.go +++ b/chrome.go @@ -4,10 +4,12 @@ package chromedpundetected import ( "context" + "fmt" "net" "os" "os/exec" "path" + "runtime" "strconv" "strings" "syscall" @@ -127,17 +129,19 @@ func headlessFlag(config Config) ([]chromedp.ExecAllocatorOption, func() error, if config.Headless { // Create virtual display - frameBuffer, err := newFrameBuffer("1920x1080x24") + // frameBuffer, err := newFrameBuffer("1920x1080x24") + frameBuffer, err := newFrameBuffer("1280x1024x16") if err != nil { return nil, nil, err } cleanup = frameBuffer.Stop + fmt.Println("Yes, debuggin...") opts = append(opts, // chromedp.Flag("headless", true), - chromedp.Flag("window-size", "1920,1080"), - chromedp.Flag("start-maximized", true), + // chromedp.Flag("window-size", "1920,1080"), + // chromedp.Flag("start-maximized", true), chromedp.Flag("no-sandbox", true), chromedp.ModifyCmdFunc(func(cmd *exec.Cmd) { cmd.Env = append(cmd.Env, "DISPLAY=:"+frameBuffer.Display) @@ -154,7 +158,9 @@ func headlessFlag(config Config) ([]chromedp.ExecAllocatorOption, func() error, } // When the parent process dies (Go), kill the child as well. - cmd.SysProcAttr.Pdeathsig = syscall.SIGKILL + if runtime.GOOS == "linux" { + cmd.SysProcAttr.Pdeathsig = syscall.SIGKILL + } }), ) } diff --git a/display.go b/display.go index 07286fe..fe0d91e 100644 --- a/display.go +++ b/display.go @@ -7,10 +7,8 @@ import ( "os" "os/exec" "regexp" - "strconv" - "strings" + "runtime" "syscall" - "time" "golang.org/x/exp/slog" ) @@ -60,7 +58,8 @@ func newFrameBuffer(screenSize string) (*frameBuffer, error) { //nolint:funlen // Xvfb will print the display on which it is listening to file descriptor 3, // for which we provide a pipe. - arguments := []string{"-displayfd", "3", "-nolisten", "tcp"} + // arguments := []string{"-displayfd", "3", "-nolisten", "tcp"} + arguments := []string{":3"} if screenSize != "" { screenSizeExpression := regexp.MustCompile(`^\d+x\d+(?:x\d+)$`) @@ -68,7 +67,8 @@ func newFrameBuffer(screenSize string) (*frameBuffer, error) { //nolint:funlen return nil, fmt.Errorf("invalid screen size: expected 'WxH[xD]', got %q", screenSize) } - arguments = append(arguments, "-screen", "0", screenSize) + arguments = append(arguments, "-screen", ":3", screenSize) + // arguments = append(arguments, "-screen", "0", screenSize) } xvfb := exec.Command("Xvfb", arguments...) @@ -79,7 +79,9 @@ func newFrameBuffer(screenSize string) (*frameBuffer, error) { //nolint:funlen xvfb.SysProcAttr = new(syscall.SysProcAttr) } - xvfb.SysProcAttr.Pdeathsig = syscall.SIGKILL + if runtime.GOOS == "linux" { + xvfb.SysProcAttr.Pdeathsig = syscall.SIGKILL + } if err := xvfb.Start(); err != nil { return nil, err @@ -103,21 +105,22 @@ func newFrameBuffer(screenSize string) (*frameBuffer, error) { //nolint:funlen }() var display string - select { - case resp := <-ch: - if resp.err != nil { - return nil, resp.err - } - - display = strings.TrimSpace(resp.display) - if _, err := strconv.Atoi(display); err != nil { - return nil, errors.New("xvfb did not print the display number") - } - - case <-time.After(10 * time.Second): - return nil, errors.New("timeout waiting for Xvfb") - } - + // select { + // case resp := <-ch: + // if resp.err != nil { + // return nil, resp.err + // } + // + // display = strings.TrimSpace(resp.display) + // if _, err := strconv.Atoi(display); err != nil { + // return nil, errors.New("xvfb did not print the display number") + // } + // + // case <-time.After(10 * time.Second): + // return nil, errors.New("timeout waiting for Xvfb") + // } + + display = "3" xauth := exec.Command("xauth", "generate", ":"+display, ".", "trusted") //nolint:gosec xauth.Env = append(xauth.Env, "XAUTHORITY="+authPath) // Make make this conditional? From f87f5536503d7322c5173f99a52589d08c9857f4 Mon Sep 17 00:00:00 2001 From: Davincible Date: Fri, 10 Feb 2023 15:56:43 +0100 Subject: [PATCH 2/2] fix: cleanup --- chrome.go | 4 ---- display.go | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/chrome.go b/chrome.go index a6449e8..de65690 100644 --- a/chrome.go +++ b/chrome.go @@ -4,7 +4,6 @@ package chromedpundetected import ( "context" - "fmt" "net" "os" "os/exec" @@ -129,7 +128,6 @@ func headlessFlag(config Config) ([]chromedp.ExecAllocatorOption, func() error, if config.Headless { // Create virtual display - // frameBuffer, err := newFrameBuffer("1920x1080x24") frameBuffer, err := newFrameBuffer("1280x1024x16") if err != nil { return nil, nil, err @@ -137,9 +135,7 @@ func headlessFlag(config Config) ([]chromedp.ExecAllocatorOption, func() error, cleanup = frameBuffer.Stop - fmt.Println("Yes, debuggin...") opts = append(opts, - // chromedp.Flag("headless", true), // chromedp.Flag("window-size", "1920,1080"), // chromedp.Flag("start-maximized", true), chromedp.Flag("no-sandbox", true), diff --git a/display.go b/display.go index fe0d91e..c67daab 100644 --- a/display.go +++ b/display.go @@ -67,8 +67,8 @@ func newFrameBuffer(screenSize string) (*frameBuffer, error) { //nolint:funlen return nil, fmt.Errorf("invalid screen size: expected 'WxH[xD]', got %q", screenSize) } - arguments = append(arguments, "-screen", ":3", screenSize) // arguments = append(arguments, "-screen", "0", screenSize) + arguments = append(arguments, "-screen", ":3", screenSize) } xvfb := exec.Command("Xvfb", arguments...) @@ -104,7 +104,7 @@ func newFrameBuffer(screenSize string) (*frameBuffer, error) { //nolint:funlen ch <- resp{s, err} }() - var display string + // var display string // select { // case resp := <-ch: // if resp.err != nil { @@ -120,7 +120,7 @@ func newFrameBuffer(screenSize string) (*frameBuffer, error) { //nolint:funlen // return nil, errors.New("timeout waiting for Xvfb") // } - display = "3" + display := "3" xauth := exec.Command("xauth", "generate", ":"+display, ".", "trusted") //nolint:gosec xauth.Env = append(xauth.Env, "XAUTHORITY="+authPath) // Make make this conditional?