-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathprinter_crossbuild.go
More file actions
93 lines (84 loc) · 2.5 KB
/
printer_crossbuild.go
File metadata and controls
93 lines (84 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//go:build !windows && crossbuild
package main
import (
"fmt"
"os/exec"
"strings"
)
// C_usb_device_exists always returns false in crossbuild (no libusb).
func C_usb_device_exists() bool { return false }
// listLocalPrinters lists CUPS printers via lpstat (no USB detection).
func listLocalPrinters() ([]PrinterInfo, error) {
var printers []PrinterInfo
// Parse CUPS printer status
statusMap := make(map[string]string)
if out, err := exec.Command("lpstat", "-p").Output(); err == nil {
for _, line := range strings.Split(string(out), "\n") {
line = strings.TrimSpace(line)
if !strings.HasPrefix(line, "printer ") && !strings.HasPrefix(line, "la impresora ") && !strings.HasPrefix(line, "impresora ") {
continue
}
fields := strings.Fields(line)
if len(fields) < 3 {
continue
}
var name string
if strings.HasPrefix(line, "la impresora ") || strings.HasPrefix(line, "impresora ") {
for _, f := range fields {
if f != "la" && f != "impresora" {
name = f
break
}
}
} else {
name = fields[1]
}
if name == "" {
continue
}
lower := strings.ToLower(line)
if strings.Contains(lower, "desactivad") || strings.Contains(lower, "disabled") {
statusMap[name] = "disabled"
} else if strings.Contains(lower, "imprimiendo") || strings.Contains(lower, "printing") {
statusMap[name] = "printing"
} else {
statusMap[name] = "idle"
}
}
}
out, err := exec.Command("lpstat", "-a").Output()
if err == nil {
for _, line := range strings.Split(string(out), "\n") {
line = strings.TrimSpace(line)
if line == "" {
continue
}
name := strings.Fields(line)[0]
status := statusMap[name]
online := status != "disabled"
printers = append(printers, PrinterInfo{
Name: name,
Type: "cups",
Online: online,
Status: status,
})
}
}
return printers, nil
}
// rawPrint sends data via CUPS lp command (no USB direct in crossbuild).
func rawPrint(printerName string, data []byte) error {
if strings.HasPrefix(printerName, "(simulated)") {
fmt.Printf("[simulate] Would print %d bytes to %s\n", len(data), printerName)
return nil
}
cupsName := strings.TrimSuffix(printerName, "-USB")
cmd := exec.Command("lp", "-d", cupsName, "-o", "raw")
cmd.Stdin = strings.NewReader(string(data))
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("lp -d %s failed: %v — %s", cupsName, err, string(output))
}
fmt.Printf("[print-cups] Sent %d bytes via lp to %s\n", len(data), cupsName)
return nil
}