| 155 | } |
| 156 | |
| 157 | func (i *Installer) writeAndCheck(f *os.File, reader io.ReadCloser) error { |
| 158 | checksum := sha256.New() |
| 159 | buf := make([]byte, 1024*1024) |
| 160 | for { |
| 161 | n, err := reader.Read(buf[0:]) |
| 162 | if err != nil && err != io.EOF { |
| 163 | return fmt.Errorf("failed to read: %w", err) |
| 164 | } |
| 165 | if n == 0 || err == io.EOF { |
| 166 | break |
| 167 | } |
| 168 | if _, err := checksum.Write(buf[:n]); err != nil { |
| 169 | return fmt.Errorf("failed to write: %w", err) |
| 170 | } |
| 171 | if _, err := f.Write(buf[:n]); err != nil { |
| 172 | return fmt.Errorf("failed to write: %w", err) |
| 173 | } |
| 174 | } |
| 175 | gotChecksum := fmt.Sprintf("%x", checksum.Sum(nil)) |
| 176 | c, ok := i.expectedChecksumFunc(i.requestedVersion) |
| 177 | if !ok { |
| 178 | return fmt.Errorf("requested driver %q is not supported", i.requestedVersion) |
| 179 | } |
| 180 | |
| 181 | wantChecksum, err := c.Checksum() |
| 182 | if err != nil { |
| 183 | return fmt.Errorf("failed to get checksum for driver %q: %v", i.requestedVersion, err) |
| 184 | } |
| 185 | |
| 186 | if gotChecksum != wantChecksum { |
| 187 | return fmt.Errorf("driver %q checksum mismatch: got %q, want %q", i.requestedVersion, gotChecksum, wantChecksum) |
| 188 | } |
| 189 | return nil |
| 190 | } |
| 191 | |
| 192 | func getCurrentDriver() (nvconf.DriverVersion, error) { |
| 193 | _, err := os.Stat(nvidiaSMIPath) |