|
4 | 4 | "context"
|
5 | 5 | "fmt"
|
6 | 6 | "os"
|
| 7 | + "os/exec" |
7 | 8 | "strconv"
|
8 | 9 | "strings"
|
9 | 10 | "sync"
|
@@ -47,6 +48,12 @@ const (
|
47 | 48 | LowCostPerformanceOption = 0
|
48 | 49 | BalancedPerformanceOption = 10
|
49 | 50 | HigherPerformanceOption = 20
|
| 51 | + |
| 52 | + InTransitEncryptionPackageName = "oci-fss-utils" |
| 53 | + FIPS_ENABLED_FILE_PATH = "/host/proc/sys/crypto/fips_enabled" |
| 54 | + FINDMNT_COMMAND = "findmnt" |
| 55 | + CAT_COMMAND = "cat" |
| 56 | + RPM_COMMAND = "rpm" |
50 | 57 | )
|
51 | 58 |
|
52 | 59 | //Util interface
|
@@ -348,3 +355,96 @@ func RoundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 {
|
348 | 355 | func RoundUpMinSize() int64 {
|
349 | 356 | return RoundUpSize(MinimumVolumeSizeInBytes, 1*client.GiB)
|
350 | 357 | }
|
| 358 | + |
| 359 | +func IsFipsEnabled() (string, error) { |
| 360 | + command := exec.Command(CAT_COMMAND, FIPS_ENABLED_FILE_PATH) |
| 361 | + output, err := command.CombinedOutput() |
| 362 | + if err != nil { |
| 363 | + return "", fmt.Errorf("command failed: %v\narguments: %s\nOutput: %v\n", err, CAT_COMMAND, string(output)) |
| 364 | + } |
| 365 | + |
| 366 | + return string(output), nil |
| 367 | +} |
| 368 | + |
| 369 | +func IsInTransitEncryptionPackageInstalled() (bool, error) { |
| 370 | + args := []string{"-q", "-a", "--root=/host"} |
| 371 | + command := exec.Command(RPM_COMMAND, args...) |
| 372 | + output, err := command.CombinedOutput() |
| 373 | + if err != nil { |
| 374 | + return false, fmt.Errorf("command failed: %v\narguments: %s\nOutput: %v\n", err, RPM_COMMAND, string(output)) |
| 375 | + } |
| 376 | + |
| 377 | + if len(output) > 0 { |
| 378 | + list := string(output) |
| 379 | + if strings.Contains(list, InTransitEncryptionPackageName) { |
| 380 | + return true, nil |
| 381 | + } |
| 382 | + return false, nil |
| 383 | + } |
| 384 | + return false, nil |
| 385 | +} |
| 386 | + |
| 387 | +func FindMount(target string) ([]string, error) { |
| 388 | + mountArgs := []string{"-n", "-o", "SOURCE", "-T", target} |
| 389 | + command := exec.Command(FINDMNT_COMMAND, mountArgs...) |
| 390 | + output, err := command.CombinedOutput() |
| 391 | + if err != nil { |
| 392 | + return nil, fmt.Errorf("findmnt failed: %v\narguments: %s\nOutput: %v\n", err, mountArgs, string(output)) |
| 393 | + } |
| 394 | + |
| 395 | + sources := strings.Fields(string(output)) |
| 396 | + return sources, nil |
| 397 | +} |
| 398 | + |
| 399 | +func Rescan(logger *zap.SugaredLogger, devicePath string) error { |
| 400 | + |
| 401 | + lsblkargs := []string{"-n", "-o", "NAME", devicePath} |
| 402 | + lsblkcmd := exec.Command("lsblk", lsblkargs...) |
| 403 | + lsblkoutput, err := lsblkcmd.CombinedOutput() |
| 404 | + if err != nil { |
| 405 | + return fmt.Errorf("Failed to find device name associated with devicePath %s", devicePath) |
| 406 | + } |
| 407 | + deviceName := strings.TrimSpace(string(lsblkoutput)) |
| 408 | + if strings.HasPrefix(deviceName, "/dev/") { |
| 409 | + deviceName = strings.TrimPrefix(deviceName, "/dev/") |
| 410 | + } |
| 411 | + logger.With("deviceName", deviceName).Info("Rescanning") |
| 412 | + |
| 413 | + // run command dd iflag=direct if=/dev/<device_name> of=/dev/null count=1 |
| 414 | + // https://docs.oracle.com/en-us/iaas/Content/Block/Tasks/rescanningdisk.htm#Rescanni |
| 415 | + devicePathFileArg := fmt.Sprintf("if=%s", devicePath) |
| 416 | + args := []string{"iflag=direct", devicePathFileArg, "of=/dev/null", "count=1"} |
| 417 | + cmd := exec.Command("dd", args...) |
| 418 | + output, err := cmd.CombinedOutput() |
| 419 | + if err != nil { |
| 420 | + return fmt.Errorf("command failed: %v\narguments: %s\nOutput: %v\n", err, "dd", string(output)) |
| 421 | + } |
| 422 | + logger.With("command", "dd", "output", string(output)).Debug("dd output") |
| 423 | + // run command echo 1 | tee /sys/class/block/%s/device/rescan |
| 424 | + // https://docs.oracle.com/en-us/iaas/Content/Block/Tasks/rescanningdisk.htm#Rescanni |
| 425 | + cmdStr := fmt.Sprintf("echo 1 | tee /sys/class/block/%s/device/rescan", deviceName) |
| 426 | + cmd = exec.Command("bash", "-c", cmdStr) |
| 427 | + output, err = cmd.CombinedOutput() |
| 428 | + if err != nil { |
| 429 | + return fmt.Errorf("command failed: %v\narguments: %s\nOutput: %v\n", err, cmdStr, string(output)) |
| 430 | + } |
| 431 | + logger.With("command", cmdStr, "output", string(output)).Debug("rescan output") |
| 432 | + |
| 433 | + return nil |
| 434 | +} |
| 435 | + |
| 436 | +func GetBlockSizeBytes(logger *zap.SugaredLogger, devicePath string) (int64, error) { |
| 437 | + args := []string{"--getsize64", devicePath} |
| 438 | + cmd := exec.Command("blockdev", args...) |
| 439 | + output, err := cmd.CombinedOutput() |
| 440 | + if err != nil { |
| 441 | + return -1, fmt.Errorf("command failed: %v\narguments: %s\nOutput: %v\n", err, "blockdev", string(output)) |
| 442 | + } |
| 443 | + strOut := strings.TrimSpace(string(output)) |
| 444 | + logger.With("devicePath", devicePath, "command", "blockdev", "output", strOut).Debugf("Get block device size in bytes successful") |
| 445 | + gotSizeBytes, err := strconv.ParseInt(strOut, 10, 64) |
| 446 | + if err != nil { |
| 447 | + return -1, fmt.Errorf("failed to parse size %s into an int64 size", strOut) |
| 448 | + } |
| 449 | + return gotSizeBytes, nil |
| 450 | +} |
0 commit comments