welcome message for users now specific for windows and linux
monitoring of hold file changes and messaging to users to provide more interactivity
This commit is contained in:
parent
1ed49c638e
commit
bdedef12f0
@ -15,7 +15,7 @@ import (
|
||||
// CHMOD
|
||||
// echo > .hold
|
||||
//
|
||||
// file name: ./.hold on linux
|
||||
// file name: ./.hold on linux and just .hold on windows
|
||||
|
||||
func main() {
|
||||
// Create a new watcher
|
||||
|
@ -48,6 +48,7 @@ func main() {
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
flag.Parse()
|
||||
log.Println("Narg ", flag.NFlag())
|
||||
if flag.NArg() != 1 {
|
||||
flag.Usage()
|
||||
os.Exit(1)
|
||||
|
@ -6,7 +6,11 @@ terminates.
|
||||
|
||||
You can extend this time using
|
||||
|
||||
{{ if eq .os "windows" -}}
|
||||
echo > %agentdir%\.hold
|
||||
{{- else -}}
|
||||
touch $agentdir/.hold
|
||||
{{- end }}
|
||||
|
||||
The expiry time is equal to the modification time of the .hold
|
||||
file with the expiry duration added.
|
||||
|
@ -1,13 +1,18 @@
|
||||
package agent
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"github.com/fsnotify/fsnotify"
|
||||
"github.com/gliderlabs/ssh"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
_ "embed"
|
||||
@ -55,7 +60,8 @@ var state AgentState
|
||||
const holdFilename = ".hold"
|
||||
|
||||
//go:embed help.txt
|
||||
var helpMessage string
|
||||
var helpMessageTemplate string
|
||||
var helpMessage = formatHelpMessage()
|
||||
|
||||
func ConfigureAgent(advanceWarningTime, agentExpiryTime, tickerInterval time.Duration) {
|
||||
if fileExists(holdFilename) {
|
||||
@ -81,6 +87,59 @@ func ConfigureAgent(advanceWarningTime, agentExpiryTime, tickerInterval time.Dur
|
||||
check()
|
||||
}
|
||||
}()
|
||||
go monitorHoldFile()
|
||||
}
|
||||
|
||||
func monitorHoldFile() {
|
||||
watcher, err := fsnotify.NewWatcher()
|
||||
if err != nil {
|
||||
log.Printf("Cannot watch old file %s, user notifications for change in expiry time will be unavailable: %v", holdFilename, err)
|
||||
}
|
||||
defer watcher.Close()
|
||||
err = watcher.Add(".")
|
||||
if err != nil {
|
||||
log.Printf("Cannot watch old file %s, user notifications for change in expiry time will be unavailable: %v", holdFilename, err)
|
||||
}
|
||||
expiryTime := state.expiryTime(holdFilename)
|
||||
for {
|
||||
select {
|
||||
case event, ok := <-watcher.Events:
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
base := filepath.Base(event.Name)
|
||||
if base == holdFilename {
|
||||
newExpiryTIme := state.expiryTime(holdFilename)
|
||||
if newExpiryTIme != expiryTime {
|
||||
message := fmt.Sprintf("Expiry time of session is now %s\n",
|
||||
newExpiryTIme.Format(time.DateTime))
|
||||
message += holdFileMessage()
|
||||
messageUsers(message)
|
||||
expiryTime = newExpiryTIme
|
||||
}
|
||||
}
|
||||
|
||||
case err, ok := <-watcher.Errors:
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
log.Println("Error:", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func holdFileMessage() string {
|
||||
message := ""
|
||||
if fileExists(holdFilename) {
|
||||
message += fmt.Sprintf("When the last user exits, the session will timeout and not exit immediately.\n"+
|
||||
"Remove the %s file if you want th session to terminate when the last user logs out",
|
||||
holdFilename)
|
||||
} else {
|
||||
message += fmt.Sprintf("When the last user exits, the agent will return and the continuous\n" +
|
||||
"integration job will continue.")
|
||||
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
func Login(sessionId int, sshSession ssh.Session) {
|
||||
@ -119,6 +178,22 @@ func PrintHelpMessage(sshSession ssh.Session) {
|
||||
state.agentExpriryTime))
|
||||
}
|
||||
|
||||
func formatHelpMessage() string {
|
||||
templ, err := template.New("help").Parse(helpMessageTemplate)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
helpFormattedBuf := bytes.NewBuffer(make([]byte, 0))
|
||||
log.Println("Runnning on ", runtime.GOOS)
|
||||
data := map[string]string{"os": runtime.GOOS}
|
||||
err = templ.Execute(helpFormattedBuf, data)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
helpFormatted := helpFormattedBuf.String()
|
||||
return helpFormatted
|
||||
}
|
||||
|
||||
func LogOut(sessionId int) {
|
||||
log.Println("User logged out")
|
||||
delete(state.sessions, sessionId)
|
||||
@ -127,7 +202,6 @@ func LogOut(sessionId int) {
|
||||
}
|
||||
|
||||
func PrintMessage(sshSession ssh.Session, message string) {
|
||||
io.WriteString(sshSession.Stderr(), "\n\r###\n\r")
|
||||
for _, line := range strings.Split(message, "\n") {
|
||||
io.WriteString(sshSession.Stderr(), "### "+line+"\n\r")
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user