(path string)
| 105 | } |
| 106 | |
| 107 | func ParseDevSpaceHosts(path string) ([]DevSpaceSSHEntry, error) { |
| 108 | var reader io.Reader |
| 109 | f, err := os.Open(path) |
| 110 | if err != nil { |
| 111 | if !os.IsNotExist(err) { |
| 112 | return nil, err |
| 113 | } |
| 114 | |
| 115 | reader = strings.NewReader("") |
| 116 | } else { |
| 117 | reader = f |
| 118 | defer f.Close() |
| 119 | } |
| 120 | |
| 121 | configScanner := scanner.NewScanner(reader) |
| 122 | inSection := false |
| 123 | |
| 124 | entries := []DevSpaceSSHEntry{} |
| 125 | current := &DevSpaceSSHEntry{} |
| 126 | for configScanner.Scan() { |
| 127 | text := strings.TrimSpace(configScanner.Text()) |
| 128 | if strings.HasPrefix(text, MarkerStartPrefix) { |
| 129 | inSection = true |
| 130 | } else if strings.HasPrefix(text, MarkerEndPrefix) { |
| 131 | if current.Host != "" && current.Port > 0 && current.Hostname != "" { |
| 132 | entries = append(entries, *current) |
| 133 | } |
| 134 | current = &DevSpaceSSHEntry{} |
| 135 | inSection = false |
| 136 | } else if inSection { |
| 137 | if strings.HasPrefix(text, "Host ") { |
| 138 | current.Host = strings.TrimPrefix(text, "Host ") |
| 139 | } |
| 140 | if strings.HasPrefix(text, "Port ") { |
| 141 | port := strings.TrimPrefix(text, "Port ") |
| 142 | intPort, err := strconv.Atoi(port) |
| 143 | if err == nil { |
| 144 | current.Port = intPort |
| 145 | } |
| 146 | } |
| 147 | if strings.HasPrefix(text, "HostName ") { |
| 148 | current.Hostname = strings.TrimPrefix(text, "HostName ") |
| 149 | } |
| 150 | } |
| 151 | } |
| 152 | if configScanner.Err() != nil { |
| 153 | return nil, errors.Wrap(err, "parse ssh config") |
| 154 | } |
| 155 | |
| 156 | return entries, nil |
| 157 | } |
| 158 | |
| 159 | func includeDevSpaceConfig(path string) (string, error) { |
| 160 | var reader io.Reader |
no test coverage detected