bash_go_service/tests/testcase/userlogin/userlogin.go

138 lines
3.0 KiB
Go

package main
import (
"fmt"
"log"
"os"
"os/signal"
"path/filepath"
"syscall"
"time"
"github.com/fsnotify/fsnotify"
)
const (
utmpDir = "/dev/pts/"
// ANSI转义序列定义颜色
colorReset = "\033[0m"
colorRed = "\033[31m"
colorGreen = "\033[32m"
colorYellow = "\033[33m"
colorBlue = "\033[34m"
colorPurple = "\033[35m"
colorCyan = "\033[36m"
colorWhite = "\033[37m"
// 样式
bold = "\033[1m"
underline = "\033[4m"
)
func main() {
logFile, err := os.OpenFile("./welcome-service.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer logFile.Close()
log.SetOutput(logFile)
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
err = watcher.Add(utmpDir)
if err != nil {
log.Fatal(err)
}
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
checkExistingTerminals()
log.Println("Service started")
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Op&fsnotify.Create == fsnotify.Create {
go handleNewTerminal(event.Name)
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
log.Printf("Watcher error: %v", err)
case sig := <-sigChan:
log.Printf("Received signal: %v", sig)
return
}
}
}
func checkExistingTerminals() {
entries, err := os.ReadDir(utmpDir)
if err != nil {
log.Printf("Error reading %s: %v", utmpDir, err)
return
}
for _, entry := range entries {
if !entry.IsDir() {
go handleNewTerminal(filepath.Join(utmpDir, entry.Name()))
}
}
}
func handleNewTerminal(path string) {
time.Sleep(time.Second)
f, err := os.OpenFile(path, os.O_WRONLY, 0)
if err != nil {
log.Printf("Error opening terminal %s: %v", path, err)
return
}
defer f.Close()
// 使用颜色和样式的欢迎信息
welcomeMsg := fmt.Sprintf(`
%s%s╔════════════════════════════════════════════╗%s
%s%s║ Welcome to the System! ║%s
%s%s║---------------------------------------- ║%s
%s%s║ Terminal: %s%s%-30s%s ║%s
%s%s║ Time: %s%s%-35s%s ║%s
%s%s╚════════════════════════════════════════════╝%s
`,
bold, colorCyan, colorReset,
bold, colorCyan, colorReset,
bold, colorCyan, colorReset,
bold, colorCyan, colorGreen, underline, path, colorCyan, colorReset,
bold, colorCyan, colorYellow, underline, time.Now().Format("2006-01-02 15:04:05"), colorCyan, colorReset,
bold, colorCyan, colorReset,
)
// 写入欢迎信息
_, err = f.WriteString(welcomeMsg)
if err != nil {
log.Printf("Error writing to terminal %s: %v", path, err)
return
}
// 模拟按下回车键
_, err = f.Write([]byte{'\n'})
if err != nil {
log.Printf("Error sending newline to terminal %s: %v", path, err)
return
}
log.Printf("Welcome message sent to %s", path)
}