func makeLocalConnectionStatusSlice(cm *connectionMaker) []LocalConnectionStatus {
	resultChan := make(chan []LocalConnectionStatus)
	cm.actionChan <- func() bool {
		var slice []LocalConnectionStatus
		for conn := range cm.connections {
			state := "pending"
			if conn.isEstablished() {
				state = "established"
			}
			lc, _ := conn.(*LocalConnection)
			attrs := lc.OverlayConn.Attrs()
			name, ok := attrs["name"]
			if !ok {
				name = "none"
			}
			info := fmt.Sprintf("%-6v %v", name, conn.Remote())
			if lc.router.usingPassword() {
				if lc.untrusted() {
					info = fmt.Sprintf("%-11v %v", "encrypted", info)
					if attrs != nil {
						attrs["encrypted"] = true
					}
				} else {
					info = fmt.Sprintf("%-11v %v", "unencrypted", info)
				}
			}
			slice = append(slice, LocalConnectionStatus{conn.remoteTCPAddress(), conn.isOutbound(), state, info, attrs})
		}
		for address, target := range cm.targets {
			add := func(state, info string) {
				slice = append(slice, LocalConnectionStatus{address, true, state, info, nil})
			}
			switch target.state {
			case targetWaiting:
				until := "never"
				if !target.tryAfter.IsZero() {
					until = target.tryAfter.String()
				}
				if target.lastError == nil { // shouldn't happen
					add("waiting", "until: "+until)
				} else {
					add("failed", target.lastError.Error()+", retry: "+until)
				}
			case targetAttempting:
				if target.lastError == nil {
					add("connecting", "")
				} else {
					add("retrying", target.lastError.Error())
				}
			case targetConnected:
			case targetSuspended:
			}
		}
		resultChan <- slice
		return false
	}
	return <-resultChan
}
func makeLocalConnectionStatusSlice(cm *connectionMaker) []LocalConnectionStatus {
	resultChan := make(chan []LocalConnectionStatus)
	cm.actionChan <- func() bool {
		var slice []LocalConnectionStatus
		for conn := range cm.connections {
			state := "pending"
			if conn.isEstablished() {
				state = "established"
			}
			lc, _ := conn.(*LocalConnection)
			attrs := lc.OverlayConn.Attrs()
			name, ok := attrs["name"]
			if !ok {
				name = "none"
			}
			info := fmt.Sprintf("%-6v %v", name, conn.Remote())
			if lc.router.usingPassword() {
				if lc.untrusted() {
					info = fmt.Sprintf("%-11v %v", "encrypted", info)
					if attrs != nil {
						attrs["encrypted"] = true
					}
				} else {
					info = fmt.Sprintf("%-11v %v", "unencrypted", info)
				}
			}
			slice = append(slice, LocalConnectionStatus{conn.remoteTCPAddress(), conn.isOutbound(), state, info, attrs})
		}
		for address, target := range cm.targets {
			add := func(state, info string) {
				slice = append(slice, LocalConnectionStatus{address, true, state, info, nil})
			}
			switch target.state {
			case targetWaiting:
				until := "never"
				if !target.tryAfter.IsZero() {
					until = target.tryAfter.String()
				}
				if target.lastError == nil { 
					add("waiting", "until: "+until)
				} else {
					add("failed", target.lastError.Error()+", retry: "+until)
				}
			case targetAttempting:
				if target.lastError == nil {
					add("connecting", "")
				} else {
					add("retrying", target.lastError.Error())
				}
			case targetConnected:
			case targetSuspended:
			}
		}
		resultChan <- slice
		return false
	}
	return <-resultChan
}
func makeLocalConnectionStatusSlice ( cm * connectionMaker ) [ ] LocalConnectionStatus { resultChan := make ( chan [ ] LocalConnectionStatus ) cm . actionChan <- func ( ) bool { var slice [ ] LocalConnectionStatus for conn := range cm . connections { state := " " if conn . isEstablished ( ) { state = " " } lc , _ := conn . ( * LocalConnection ) attrs := lc . OverlayConn . Attrs ( ) name , ok := attrs [ " " ] if ! ok { name = " " } info := fmt . Sprintf ( " " , name , conn . Remote ( ) ) if lc . router . usingPassword ( ) { if lc . untrusted ( ) { info = fmt . Sprintf ( " " , " " , info ) if attrs != nil { attrs [ " " ] = true } } else { info = fmt . Sprintf ( " " , " " , info ) } } slice = append ( slice , LocalConnectionStatus { conn . remoteTCPAddress ( ) , conn . isOutbound ( ) , state , info , attrs } ) } for address , target := range cm . targets { add := func ( state , info string ) { slice = append ( slice , LocalConnectionStatus { address , true , state , info , nil } ) } switch target . state { case targetWaiting : until := " " if ! target . tryAfter . IsZero ( ) { until = target . tryAfter . String ( ) } if target . lastError == nil { // shouldn't happen add ( " " , " " + until ) } else { add ( " " , target . lastError . Error ( ) + " " + until ) } case targetAttempting : if target . lastError == nil { add ( " " , " " ) } else { add ( " " , target . lastError . Error ( ) ) } case targetConnected : case targetSuspended : } } resultChan <- slice return false } return <- resultChan }
// makeLocalConnectionStatusSlice takes a snapshot of the active local
// connections in the ConnectionMaker.
makeLocalConnectionStatusSlice takes a snapshot of the active local connections in the ConnectionMaker .