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
|
// CHMOD
|
||||||
// echo > .hold
|
// echo > .hold
|
||||||
//
|
//
|
||||||
// file name: ./.hold on linux
|
// file name: ./.hold on linux and just .hold on windows
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Create a new watcher
|
// Create a new watcher
|
||||||
|
@ -48,6 +48,7 @@ func main() {
|
|||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
}
|
}
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
log.Println("Narg ", flag.NFlag())
|
||||||
if flag.NArg() != 1 {
|
if flag.NArg() != 1 {
|
||||||
flag.Usage()
|
flag.Usage()
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
@ -6,7 +6,11 @@ terminates.
|
|||||||
|
|
||||||
You can extend this time using
|
You can extend this time using
|
||||||
|
|
||||||
|
{{ if eq .os "windows" -}}
|
||||||
|
echo > %agentdir%\.hold
|
||||||
|
{{- else -}}
|
||||||
touch $agentdir/.hold
|
touch $agentdir/.hold
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
The expiry time is equal to the modification time of the .hold
|
The expiry time is equal to the modification time of the .hold
|
||||||
file with the expiry duration added.
|
file with the expiry duration added.
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
package agent
|
package agent
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/fsnotify/fsnotify"
|
||||||
"github.com/gliderlabs/ssh"
|
"github.com/gliderlabs/ssh"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
_ "embed"
|
_ "embed"
|
||||||
@ -55,7 +60,8 @@ var state AgentState
|
|||||||
const holdFilename = ".hold"
|
const holdFilename = ".hold"
|
||||||
|
|
||||||
//go:embed help.txt
|
//go:embed help.txt
|
||||||
var helpMessage string
|
var helpMessageTemplate string
|
||||||
|
var helpMessage = formatHelpMessage()
|
||||||
|
|
||||||
func ConfigureAgent(advanceWarningTime, agentExpiryTime, tickerInterval time.Duration) {
|
func ConfigureAgent(advanceWarningTime, agentExpiryTime, tickerInterval time.Duration) {
|
||||||
if fileExists(holdFilename) {
|
if fileExists(holdFilename) {
|
||||||
@ -81,6 +87,59 @@ func ConfigureAgent(advanceWarningTime, agentExpiryTime, tickerInterval time.Dur
|
|||||||
check()
|
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) {
|
func Login(sessionId int, sshSession ssh.Session) {
|
||||||
@ -119,6 +178,22 @@ func PrintHelpMessage(sshSession ssh.Session) {
|
|||||||
state.agentExpriryTime))
|
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) {
|
func LogOut(sessionId int) {
|
||||||
log.Println("User logged out")
|
log.Println("User logged out")
|
||||||
delete(state.sessions, sessionId)
|
delete(state.sessions, sessionId)
|
||||||
@ -127,7 +202,6 @@ func LogOut(sessionId int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func PrintMessage(sshSession ssh.Session, message string) {
|
func PrintMessage(sshSession ssh.Session, message string) {
|
||||||
io.WriteString(sshSession.Stderr(), "\n\r###\n\r")
|
|
||||||
for _, line := range strings.Split(message, "\n") {
|
for _, line := range strings.Split(message, "\n") {
|
||||||
io.WriteString(sshSession.Stderr(), "### "+line+"\n\r")
|
io.WriteString(sshSession.Stderr(), "### "+line+"\n\r")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user