@@ -26,7 +26,7 @@ var generateFlags = []cli.Flag{
26
26
cli.StringSliceFlag {Name : "cap-drop" , Usage : "drop Linux capabilities" },
27
27
cli.StringFlag {Name : "cgroups-path" , Usage : "specify the path to the cgroups" },
28
28
cli.StringFlag {Name : "cwd" , Value : "/" , Usage : "current working directory for the process" },
29
- cli.StringSliceFlag {Name : "device" , Usage : "specifies a device which must be made available in the container" },
29
+ cli.StringSliceFlag {Name : "device-add " , Usage : "add a device which must be made available in the container" },
30
30
cli.BoolFlag {Name : "disable-oom-kill" , Usage : "disable OOM Killer" },
31
31
cli.StringSliceFlag {Name : "env" , Usage : "add environment variable e.g. key=value" },
32
32
cli.StringSliceFlag {Name : "env-file" , Usage : "read in a file of environment variables" },
@@ -502,15 +502,17 @@ func setupSpec(g *generate.Generator, context *cli.Context) error {
502
502
g .ClearProcessRlimits ()
503
503
}
504
504
505
- if context .IsSet ("device" ) {
506
- devices := context .StringSlice ("device" )
505
+ if context .IsSet ("device-add " ) {
506
+ devices := context .StringSlice ("device-add " )
507
507
for _ , deviceArg := range devices {
508
- err := addDevice (deviceArg , g )
508
+ dev , err := parseDevice (deviceArg , g )
509
509
if err != nil {
510
510
return err
511
511
}
512
+ g .AddDevice (dev )
512
513
}
513
514
}
515
+
514
516
err := addSeccomp (context , g )
515
517
return err
516
518
}
@@ -642,33 +644,33 @@ var deviceType = map[string]bool{
642
644
"p" : true , // a FIFO
643
645
}
644
646
645
- // addDevice takes the raw string passed with the --device flag, parses it, and add it
646
- func addDevice (device string , g * generate.Generator ) error {
647
+ // parseDevice takes the raw string passed with the --device flag
648
+ func parseDevice (device string , g * generate.Generator ) (rspec. Device , error ) {
647
649
dev := rspec.Device {}
648
650
649
651
// The required part and optional part are seperated by ":"
650
652
argsParts := strings .Split (device , ":" )
651
653
if len (argsParts ) < 4 {
652
- return fmt .Errorf ("Incomplete device arguments: %s" , device )
654
+ return dev , fmt .Errorf ("Incomplete device arguments: %s" , device )
653
655
}
654
656
requiredPart := argsParts [0 :4 ]
655
657
optionalPart := argsParts [4 :]
656
658
657
659
// The required part must contain type, major, minor, and path
658
660
dev .Type = requiredPart [0 ]
659
661
if ! deviceType [dev .Type ] {
660
- return fmt .Errorf ("Invalid device type: %s" , dev .Type )
662
+ return dev , fmt .Errorf ("Invalid device type: %s" , dev .Type )
661
663
}
662
664
663
665
i , err := strconv .ParseInt (requiredPart [1 ], 10 , 64 )
664
666
if err != nil {
665
- return err
667
+ return dev , err
666
668
}
667
669
dev .Major = i
668
670
669
671
i , err = strconv .ParseInt (requiredPart [2 ], 10 , 64 )
670
672
if err != nil {
671
- return err
673
+ return dev , err
672
674
}
673
675
dev .Minor = i
674
676
dev .Path = requiredPart [3 ]
@@ -678,7 +680,7 @@ func addDevice(device string, g *generate.Generator) error {
678
680
parts := strings .SplitN (s , "=" , 2 )
679
681
680
682
if len (parts ) != 2 {
681
- return fmt .Errorf ("Incomplete device arguments: %s" , s )
683
+ return dev , fmt .Errorf ("Incomplete device arguments: %s" , s )
682
684
}
683
685
684
686
name , value := parts [0 ], parts [1 ]
@@ -687,33 +689,31 @@ func addDevice(device string, g *generate.Generator) error {
687
689
case "fileMode" :
688
690
i , err := strconv .ParseInt (value , 10 , 32 )
689
691
if err != nil {
690
- return err
692
+ return dev , err
691
693
}
692
694
mode := os .FileMode (i )
693
695
dev .FileMode = & mode
694
696
case "uid" :
695
697
i , err := strconv .ParseInt (value , 10 , 32 )
696
698
if err != nil {
697
- return err
699
+ return dev , err
698
700
}
699
701
uid := uint32 (i )
700
702
dev .UID = & uid
701
703
702
704
case "gid" :
703
705
i , err := strconv .ParseInt (value , 10 , 32 )
704
706
if err != nil {
705
- return err
707
+ return dev , err
706
708
}
707
709
gid := uint32 (i )
708
710
dev .GID = & gid
709
711
default :
710
- return fmt .Errorf ("'%s' is not supported by device section" , name )
712
+ return dev , fmt .Errorf ("'%s' is not supported by device section" , name )
711
713
}
712
714
}
713
715
714
- g .AddDevice (dev .Path , dev .Type , dev .Major , dev .Minor , dev .FileMode , dev .UID , dev .GID )
715
-
716
- return nil
716
+ return dev , nil
717
717
}
718
718
719
719
func addSeccomp (context * cli.Context , g * generate.Generator ) error {
0 commit comments