Import ocitools/generate library
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
This commit is contained in:
parent
32876892fc
commit
90a446e2a5
16 changed files with 3214 additions and 2 deletions
13
Godeps/Godeps.json
generated
13
Godeps/Godeps.json
generated
|
@ -20,6 +20,19 @@
|
||||||
"Comment": "v1.4.0-alpha.0-1096-g60894b9",
|
"Comment": "v1.4.0-alpha.0-1096-g60894b9",
|
||||||
"Rev": "60894b9e4089dd5a854b2c71b6f7d7b1e7a6e9f3"
|
"Rev": "60894b9e4089dd5a854b2c71b6f7d7b1e7a6e9f3"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "github.com/opencontainers/ocitools/generate",
|
||||||
|
"Rev": "cc6b67605256c65ba19da6a201e3b0f264b8ba40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "github.com/opencontainers/runtime-spec/specs-go",
|
||||||
|
"Comment": "v1.0.0-rc1-30-g5c5867d",
|
||||||
|
"Rev": "5c5867d534f48d4fb70ec2f9593a3a4ddc5b472c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "github.com/syndtr/gocapability/capability",
|
||||||
|
"Rev": "2c00daeb6c3b45114c80ac44119e7b8801fdd852"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/urfave/cli",
|
"ImportPath": "github.com/urfave/cli",
|
||||||
"Comment": "v1.18.0-6-g3a52162",
|
"Comment": "v1.18.0-6-g3a52162",
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
pb "github.com/kubernetes/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
pb "github.com/kubernetes/kubernetes/pkg/kubelet/api/v1alpha1/runtime"
|
||||||
|
"github.com/opencontainers/ocitools/generate"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -36,8 +39,19 @@ func (s *Server) Version(ctx context.Context, req *pb.VersionRequest) (*pb.Versi
|
||||||
|
|
||||||
// CreatePodSandbox creates a pod-level sandbox.
|
// CreatePodSandbox creates a pod-level sandbox.
|
||||||
// The definition of PodSandbox is at https://github.com/kubernetes/kubernetes/pull/25899
|
// The definition of PodSandbox is at https://github.com/kubernetes/kubernetes/pull/25899
|
||||||
func (s *Server) CreatePodSandbox(context.Context, *pb.CreatePodSandboxRequest) (*pb.CreatePodSandboxResponse, error) {
|
func (s *Server) CreatePodSandbox(ctx context.Context, req *pb.CreatePodSandboxRequest) (*pb.CreatePodSandboxResponse, error) {
|
||||||
return nil, nil
|
var err error
|
||||||
|
|
||||||
|
// TODO: Parametrize as a global argument to ocid
|
||||||
|
ocidSandboxDir := "/var/lib/ocid/sandbox"
|
||||||
|
podSandboxDir := filepath.Join(ocidSandboxDir, req.GetConfig().GetName())
|
||||||
|
|
||||||
|
g := generate.New()
|
||||||
|
|
||||||
|
// TODO: Customize the config per the settings in the req
|
||||||
|
err = g.SaveToFile(filepath.Join(podSandboxDir, "config.json"))
|
||||||
|
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// StopPodSandbox stops the sandbox. If there are any running containers in the
|
// StopPodSandbox stops the sandbox. If there are any running containers in the
|
||||||
|
|
191
vendor/github.com/opencontainers/ocitools/LICENSE
generated
vendored
Normal file
191
vendor/github.com/opencontainers/ocitools/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Copyright 2015 The Linux Foundation.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
21
vendor/github.com/opencontainers/ocitools/generate/default.go
generated
vendored
Normal file
21
vendor/github.com/opencontainers/ocitools/generate/default.go
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package generate
|
||||||
|
|
||||||
|
var (
|
||||||
|
// DefaultCaps include the default capabilities.
|
||||||
|
DefaultCaps = []string{
|
||||||
|
"CAP_CHOWN",
|
||||||
|
"CAP_DAC_OVERRIDE",
|
||||||
|
"CAP_FSETID",
|
||||||
|
"CAP_FOWNER",
|
||||||
|
"CAP_MKNOD",
|
||||||
|
"CAP_NET_RAW",
|
||||||
|
"CAP_SETGID",
|
||||||
|
"CAP_SETUID",
|
||||||
|
"CAP_SETFCAP",
|
||||||
|
"CAP_SETPCAP",
|
||||||
|
"CAP_NET_BIND_SERVICE",
|
||||||
|
"CAP_SYS_CHROOT",
|
||||||
|
"CAP_KILL",
|
||||||
|
"CAP_AUDIT_WRITE",
|
||||||
|
}
|
||||||
|
)
|
1015
vendor/github.com/opencontainers/ocitools/generate/generate.go
generated
vendored
Normal file
1015
vendor/github.com/opencontainers/ocitools/generate/generate.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
191
vendor/github.com/opencontainers/runtime-spec/LICENSE
generated
vendored
Normal file
191
vendor/github.com/opencontainers/runtime-spec/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Copyright 2015 The Linux Foundation.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
471
vendor/github.com/opencontainers/runtime-spec/specs-go/config.go
generated
vendored
Normal file
471
vendor/github.com/opencontainers/runtime-spec/specs-go/config.go
generated
vendored
Normal file
|
@ -0,0 +1,471 @@
|
||||||
|
package specs
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
// Spec is the base configuration for the container.
|
||||||
|
type Spec struct {
|
||||||
|
// Version is the version of the specification that is supported.
|
||||||
|
Version string `json:"ociVersion"`
|
||||||
|
// Platform is the host information for OS and Arch.
|
||||||
|
Platform Platform `json:"platform"`
|
||||||
|
// Process is the container's main process.
|
||||||
|
Process Process `json:"process"`
|
||||||
|
// Root is the root information for the container's filesystem.
|
||||||
|
Root Root `json:"root"`
|
||||||
|
// Hostname is the container's host name.
|
||||||
|
Hostname string `json:"hostname,omitempty"`
|
||||||
|
// Mounts profile configuration for adding mounts to the container's filesystem.
|
||||||
|
Mounts []Mount `json:"mounts,omitempty"`
|
||||||
|
// Hooks are the commands run at various lifecycle events of the container.
|
||||||
|
Hooks Hooks `json:"hooks"`
|
||||||
|
// Annotations is an unstructured key value map that may be set by external tools to store and retrieve arbitrary metadata.
|
||||||
|
Annotations map[string]string `json:"annotations,omitempty"`
|
||||||
|
|
||||||
|
// Linux is platform specific configuration for Linux based containers.
|
||||||
|
Linux *Linux `json:"linux,omitempty" platform:"linux"`
|
||||||
|
// Solaris is platform specific configuration for Solaris containers.
|
||||||
|
Solaris *Solaris `json:"solaris,omitempty" platform:"solaris"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process contains information to start a specific application inside the container.
|
||||||
|
type Process struct {
|
||||||
|
// Terminal creates an interactive terminal for the container.
|
||||||
|
Terminal bool `json:"terminal,omitempty"`
|
||||||
|
// User specifies user information for the process.
|
||||||
|
User User `json:"user"`
|
||||||
|
// Args specifies the binary and arguments for the application to execute.
|
||||||
|
Args []string `json:"args"`
|
||||||
|
// Env populates the process environment for the process.
|
||||||
|
Env []string `json:"env,omitempty"`
|
||||||
|
// Cwd is the current working directory for the process and must be
|
||||||
|
// relative to the container's root.
|
||||||
|
Cwd string `json:"cwd"`
|
||||||
|
// Capabilities are Linux capabilities that are kept for the container.
|
||||||
|
Capabilities []string `json:"capabilities,omitempty" platform:"linux"`
|
||||||
|
// Rlimits specifies rlimit options to apply to the process.
|
||||||
|
Rlimits []Rlimit `json:"rlimits,omitempty"`
|
||||||
|
// NoNewPrivileges controls whether additional privileges could be gained by processes in the container.
|
||||||
|
NoNewPrivileges bool `json:"noNewPrivileges,omitempty"`
|
||||||
|
|
||||||
|
// ApparmorProfile specifies the apparmor profile for the container. (this field is platform dependent)
|
||||||
|
ApparmorProfile string `json:"apparmorProfile,omitempty" platform:"linux"`
|
||||||
|
// SelinuxLabel specifies the selinux context that the container process is run as. (this field is platform dependent)
|
||||||
|
SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// User specifies Linux/Solaris specific user and group information for the container's
|
||||||
|
// main process.
|
||||||
|
type User struct {
|
||||||
|
// UID is the user id. (this field is platform dependent)
|
||||||
|
UID uint32 `json:"uid" platform:"linux,solaris"`
|
||||||
|
// GID is the group id. (this field is platform dependent)
|
||||||
|
GID uint32 `json:"gid" platform:"linux,solaris"`
|
||||||
|
// AdditionalGids are additional group ids set for the container's process. (this field is platform dependent)
|
||||||
|
AdditionalGids []uint32 `json:"additionalGids,omitempty" platform:"linux,solaris"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Root contains information about the container's root filesystem on the host.
|
||||||
|
type Root struct {
|
||||||
|
// Path is the absolute path to the container's root filesystem.
|
||||||
|
Path string `json:"path"`
|
||||||
|
// Readonly makes the root filesystem for the container readonly before the process is executed.
|
||||||
|
Readonly bool `json:"readonly,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Platform specifies OS and arch information for the host system that the container
|
||||||
|
// is created for.
|
||||||
|
type Platform struct {
|
||||||
|
// OS is the operating system.
|
||||||
|
OS string `json:"os"`
|
||||||
|
// Arch is the architecture
|
||||||
|
Arch string `json:"arch"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mount specifies a mount for a container.
|
||||||
|
type Mount struct {
|
||||||
|
// Destination is the path where the mount will be placed relative to the container's root. The path and child directories MUST exist, a runtime MUST NOT create directories automatically to a mount point.
|
||||||
|
Destination string `json:"destination"`
|
||||||
|
// Type specifies the mount kind.
|
||||||
|
Type string `json:"type"`
|
||||||
|
// Source specifies the source path of the mount. In the case of bind mounts on
|
||||||
|
// Linux based systems this would be the file on the host.
|
||||||
|
Source string `json:"source"`
|
||||||
|
// Options are fstab style mount options.
|
||||||
|
Options []string `json:"options,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hook specifies a command that is run at a particular event in the lifecycle of a container
|
||||||
|
type Hook struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
Args []string `json:"args,omitempty"`
|
||||||
|
Env []string `json:"env,omitempty"`
|
||||||
|
Timeout *int `json:"timeout,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hooks for container setup and teardown
|
||||||
|
type Hooks struct {
|
||||||
|
// Prestart is a list of hooks to be run before the container process is executed.
|
||||||
|
// On Linux, they are run after the container namespaces are created.
|
||||||
|
Prestart []Hook `json:"prestart,omitempty"`
|
||||||
|
// Poststart is a list of hooks to be run after the container process is started.
|
||||||
|
Poststart []Hook `json:"poststart,omitempty"`
|
||||||
|
// Poststop is a list of hooks to be run after the container process exits.
|
||||||
|
Poststop []Hook `json:"poststop,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linux contains platform specific configuration for Linux based containers.
|
||||||
|
type Linux struct {
|
||||||
|
// UIDMapping specifies user mappings for supporting user namespaces on Linux.
|
||||||
|
UIDMappings []IDMapping `json:"uidMappings,omitempty"`
|
||||||
|
// GIDMapping specifies group mappings for supporting user namespaces on Linux.
|
||||||
|
GIDMappings []IDMapping `json:"gidMappings,omitempty"`
|
||||||
|
// Sysctl are a set of key value pairs that are set for the container on start
|
||||||
|
Sysctl map[string]string `json:"sysctl,omitempty"`
|
||||||
|
// Resources contain cgroup information for handling resource constraints
|
||||||
|
// for the container
|
||||||
|
Resources *Resources `json:"resources,omitempty"`
|
||||||
|
// CgroupsPath specifies the path to cgroups that are created and/or joined by the container.
|
||||||
|
// The path is expected to be relative to the cgroups mountpoint.
|
||||||
|
// If resources are specified, the cgroups at CgroupsPath will be updated based on resources.
|
||||||
|
CgroupsPath *string `json:"cgroupsPath,omitempty"`
|
||||||
|
// Namespaces contains the namespaces that are created and/or joined by the container
|
||||||
|
Namespaces []Namespace `json:"namespaces,omitempty"`
|
||||||
|
// Devices are a list of device nodes that are created for the container
|
||||||
|
Devices []Device `json:"devices,omitempty"`
|
||||||
|
// Seccomp specifies the seccomp security settings for the container.
|
||||||
|
Seccomp *Seccomp `json:"seccomp,omitempty"`
|
||||||
|
// RootfsPropagation is the rootfs mount propagation mode for the container.
|
||||||
|
RootfsPropagation string `json:"rootfsPropagation,omitempty"`
|
||||||
|
// MaskedPaths masks over the provided paths inside the container.
|
||||||
|
MaskedPaths []string `json:"maskedPaths,omitempty"`
|
||||||
|
// ReadonlyPaths sets the provided paths as RO inside the container.
|
||||||
|
ReadonlyPaths []string `json:"readonlyPaths,omitempty"`
|
||||||
|
// MountLabel specifies the selinux context for the mounts in the container.
|
||||||
|
MountLabel string `json:"mountLabel,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Namespace is the configuration for a Linux namespace
|
||||||
|
type Namespace struct {
|
||||||
|
// Type is the type of Linux namespace
|
||||||
|
Type NamespaceType `json:"type"`
|
||||||
|
// Path is a path to an existing namespace persisted on disk that can be joined
|
||||||
|
// and is of the same type
|
||||||
|
Path string `json:"path,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NamespaceType is one of the Linux namespaces
|
||||||
|
type NamespaceType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PIDNamespace for isolating process IDs
|
||||||
|
PIDNamespace NamespaceType = "pid"
|
||||||
|
// NetworkNamespace for isolating network devices, stacks, ports, etc
|
||||||
|
NetworkNamespace = "network"
|
||||||
|
// MountNamespace for isolating mount points
|
||||||
|
MountNamespace = "mount"
|
||||||
|
// IPCNamespace for isolating System V IPC, POSIX message queues
|
||||||
|
IPCNamespace = "ipc"
|
||||||
|
// UTSNamespace for isolating hostname and NIS domain name
|
||||||
|
UTSNamespace = "uts"
|
||||||
|
// UserNamespace for isolating user and group IDs
|
||||||
|
UserNamespace = "user"
|
||||||
|
// CgroupNamespace for isolating cgroup hierarchies
|
||||||
|
CgroupNamespace = "cgroup"
|
||||||
|
)
|
||||||
|
|
||||||
|
// IDMapping specifies UID/GID mappings
|
||||||
|
type IDMapping struct {
|
||||||
|
// HostID is the UID/GID of the host user or group
|
||||||
|
HostID uint32 `json:"hostID"`
|
||||||
|
// ContainerID is the UID/GID of the container's user or group
|
||||||
|
ContainerID uint32 `json:"containerID"`
|
||||||
|
// Size is the length of the range of IDs mapped between the two namespaces
|
||||||
|
Size uint32 `json:"size"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rlimit type and restrictions
|
||||||
|
type Rlimit struct {
|
||||||
|
// Type of the rlimit to set
|
||||||
|
Type string `json:"type"`
|
||||||
|
// Hard is the hard limit for the specified type
|
||||||
|
Hard uint64 `json:"hard"`
|
||||||
|
// Soft is the soft limit for the specified type
|
||||||
|
Soft uint64 `json:"soft"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// HugepageLimit structure corresponds to limiting kernel hugepages
|
||||||
|
type HugepageLimit struct {
|
||||||
|
// Pagesize is the hugepage size
|
||||||
|
Pagesize *string `json:"pageSize,omitempty"`
|
||||||
|
// Limit is the limit of "hugepagesize" hugetlb usage
|
||||||
|
Limit *uint64 `json:"limit,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InterfacePriority for network interfaces
|
||||||
|
type InterfacePriority struct {
|
||||||
|
// Name is the name of the network interface
|
||||||
|
Name string `json:"name"`
|
||||||
|
// Priority for the interface
|
||||||
|
Priority uint32 `json:"priority"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// blockIODevice holds major:minor format supported in blkio cgroup
|
||||||
|
type blockIODevice struct {
|
||||||
|
// Major is the device's major number.
|
||||||
|
Major int64 `json:"major"`
|
||||||
|
// Minor is the device's minor number.
|
||||||
|
Minor int64 `json:"minor"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// WeightDevice struct holds a `major:minor weight` pair for blkioWeightDevice
|
||||||
|
type WeightDevice struct {
|
||||||
|
blockIODevice
|
||||||
|
// Weight is the bandwidth rate for the device, range is from 10 to 1000
|
||||||
|
Weight *uint16 `json:"weight,omitempty"`
|
||||||
|
// LeafWeight is the bandwidth rate for the device while competing with the cgroup's child cgroups, range is from 10 to 1000, CFQ scheduler only
|
||||||
|
LeafWeight *uint16 `json:"leafWeight,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ThrottleDevice struct holds a `major:minor rate_per_second` pair
|
||||||
|
type ThrottleDevice struct {
|
||||||
|
blockIODevice
|
||||||
|
// Rate is the IO rate limit per cgroup per device
|
||||||
|
Rate *uint64 `json:"rate,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlockIO for Linux cgroup 'blkio' resource management
|
||||||
|
type BlockIO struct {
|
||||||
|
// Specifies per cgroup weight, range is from 10 to 1000
|
||||||
|
Weight *uint16 `json:"blkioWeight,omitempty"`
|
||||||
|
// Specifies tasks' weight in the given cgroup while competing with the cgroup's child cgroups, range is from 10 to 1000, CFQ scheduler only
|
||||||
|
LeafWeight *uint16 `json:"blkioLeafWeight,omitempty"`
|
||||||
|
// Weight per cgroup per device, can override BlkioWeight
|
||||||
|
WeightDevice []WeightDevice `json:"blkioWeightDevice,omitempty"`
|
||||||
|
// IO read rate limit per cgroup per device, bytes per second
|
||||||
|
ThrottleReadBpsDevice []ThrottleDevice `json:"blkioThrottleReadBpsDevice,omitempty"`
|
||||||
|
// IO write rate limit per cgroup per device, bytes per second
|
||||||
|
ThrottleWriteBpsDevice []ThrottleDevice `json:"blkioThrottleWriteBpsDevice,omitempty"`
|
||||||
|
// IO read rate limit per cgroup per device, IO per second
|
||||||
|
ThrottleReadIOPSDevice []ThrottleDevice `json:"blkioThrottleReadIOPSDevice,omitempty"`
|
||||||
|
// IO write rate limit per cgroup per device, IO per second
|
||||||
|
ThrottleWriteIOPSDevice []ThrottleDevice `json:"blkioThrottleWriteIOPSDevice,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory for Linux cgroup 'memory' resource management
|
||||||
|
type Memory struct {
|
||||||
|
// Memory limit (in bytes).
|
||||||
|
Limit *uint64 `json:"limit,omitempty"`
|
||||||
|
// Memory reservation or soft_limit (in bytes).
|
||||||
|
Reservation *uint64 `json:"reservation,omitempty"`
|
||||||
|
// Total memory limit (memory + swap).
|
||||||
|
Swap *uint64 `json:"swap,omitempty"`
|
||||||
|
// Kernel memory limit (in bytes).
|
||||||
|
Kernel *uint64 `json:"kernel,omitempty"`
|
||||||
|
// Kernel memory limit for tcp (in bytes)
|
||||||
|
KernelTCP *uint64 `json:"kernelTCP"`
|
||||||
|
// How aggressive the kernel will swap memory pages. Range from 0 to 100.
|
||||||
|
Swappiness *uint64 `json:"swappiness,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CPU for Linux cgroup 'cpu' resource management
|
||||||
|
type CPU struct {
|
||||||
|
// CPU shares (relative weight (ratio) vs. other cgroups with cpu shares).
|
||||||
|
Shares *uint64 `json:"shares,omitempty"`
|
||||||
|
// CPU hardcap limit (in usecs). Allowed cpu time in a given period.
|
||||||
|
Quota *uint64 `json:"quota,omitempty"`
|
||||||
|
// CPU period to be used for hardcapping (in usecs).
|
||||||
|
Period *uint64 `json:"period,omitempty"`
|
||||||
|
// How much time realtime scheduling may use (in usecs).
|
||||||
|
RealtimeRuntime *uint64 `json:"realtimeRuntime,omitempty"`
|
||||||
|
// CPU period to be used for realtime scheduling (in usecs).
|
||||||
|
RealtimePeriod *uint64 `json:"realtimePeriod,omitempty"`
|
||||||
|
// CPUs to use within the cpuset. Default is to use any CPU available.
|
||||||
|
Cpus *string `json:"cpus,omitempty"`
|
||||||
|
// List of memory nodes in the cpuset. Default is to use any available memory node.
|
||||||
|
Mems *string `json:"mems,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pids for Linux cgroup 'pids' resource management (Linux 4.3)
|
||||||
|
type Pids struct {
|
||||||
|
// Maximum number of PIDs. Default is "no limit".
|
||||||
|
Limit *int64 `json:"limit,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Network identification and priority configuration
|
||||||
|
type Network struct {
|
||||||
|
// Set class identifier for container's network packets
|
||||||
|
ClassID *uint32 `json:"classID"`
|
||||||
|
// Set priority of network traffic for container
|
||||||
|
Priorities []InterfacePriority `json:"priorities,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resources has container runtime resource constraints
|
||||||
|
type Resources struct {
|
||||||
|
// Devices are a list of device rules for the whitelist controller
|
||||||
|
Devices []DeviceCgroup `json:"devices"`
|
||||||
|
// DisableOOMKiller disables the OOM killer for out of memory conditions
|
||||||
|
DisableOOMKiller *bool `json:"disableOOMKiller,omitempty"`
|
||||||
|
// Specify an oom_score_adj for the container.
|
||||||
|
OOMScoreAdj *int `json:"oomScoreAdj,omitempty"`
|
||||||
|
// Memory restriction configuration
|
||||||
|
Memory *Memory `json:"memory,omitempty"`
|
||||||
|
// CPU resource restriction configuration
|
||||||
|
CPU *CPU `json:"cpu,omitempty"`
|
||||||
|
// Task resource restriction configuration.
|
||||||
|
Pids *Pids `json:"pids,omitempty"`
|
||||||
|
// BlockIO restriction configuration
|
||||||
|
BlockIO *BlockIO `json:"blockIO,omitempty"`
|
||||||
|
// Hugetlb limit (in bytes)
|
||||||
|
HugepageLimits []HugepageLimit `json:"hugepageLimits,omitempty"`
|
||||||
|
// Network restriction configuration
|
||||||
|
Network *Network `json:"network,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Device represents the mknod information for a Linux special device file
|
||||||
|
type Device struct {
|
||||||
|
// Path to the device.
|
||||||
|
Path string `json:"path"`
|
||||||
|
// Device type, block, char, etc.
|
||||||
|
Type string `json:"type"`
|
||||||
|
// Major is the device's major number.
|
||||||
|
Major int64 `json:"major"`
|
||||||
|
// Minor is the device's minor number.
|
||||||
|
Minor int64 `json:"minor"`
|
||||||
|
// FileMode permission bits for the device.
|
||||||
|
FileMode *os.FileMode `json:"fileMode,omitempty"`
|
||||||
|
// UID of the device.
|
||||||
|
UID *uint32 `json:"uid,omitempty"`
|
||||||
|
// Gid of the device.
|
||||||
|
GID *uint32 `json:"gid,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeviceCgroup represents a device rule for the whitelist controller
|
||||||
|
type DeviceCgroup struct {
|
||||||
|
// Allow or deny
|
||||||
|
Allow bool `json:"allow"`
|
||||||
|
// Device type, block, char, etc.
|
||||||
|
Type *string `json:"type,omitempty"`
|
||||||
|
// Major is the device's major number.
|
||||||
|
Major *int64 `json:"major,omitempty"`
|
||||||
|
// Minor is the device's minor number.
|
||||||
|
Minor *int64 `json:"minor,omitempty"`
|
||||||
|
// Cgroup access permissions format, rwm.
|
||||||
|
Access *string `json:"access,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Seccomp represents syscall restrictions
|
||||||
|
type Seccomp struct {
|
||||||
|
DefaultAction Action `json:"defaultAction"`
|
||||||
|
Architectures []Arch `json:"architectures"`
|
||||||
|
Syscalls []Syscall `json:"syscalls,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Solaris contains platform specific configuration for Solaris application containers.
|
||||||
|
type Solaris struct {
|
||||||
|
// SMF FMRI which should go "online" before we start the container process.
|
||||||
|
Milestone string `json:"milestone,omitempty"`
|
||||||
|
// Maximum set of privileges any process in this container can obtain.
|
||||||
|
LimitPriv string `json:"limitpriv,omitempty"`
|
||||||
|
// The maximum amount of shared memory allowed for this container.
|
||||||
|
MaxShmMemory string `json:"maxShmMemory,omitempty"`
|
||||||
|
// Specification for automatic creation of network resources for this container.
|
||||||
|
Anet []Anet `json:"anet,omitempty"`
|
||||||
|
// Set limit on the amount of CPU time that can be used by container.
|
||||||
|
CappedCPU *CappedCPU `json:"cappedCPU,omitempty"`
|
||||||
|
// The physical and swap caps on the memory that can be used by this container.
|
||||||
|
CappedMemory *CappedMemory `json:"cappedMemory,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CappedCPU allows users to set limit on the amount of CPU time that can be used by container.
|
||||||
|
type CappedCPU struct {
|
||||||
|
Ncpus string `json:"ncpus,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CappedMemory allows users to set the physical and swap caps on the memory that can be used by this container.
|
||||||
|
type CappedMemory struct {
|
||||||
|
Physical string `json:"physical,omitempty"`
|
||||||
|
Swap string `json:"swap,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anet provides the specification for automatic creation of network resources for this container.
|
||||||
|
type Anet struct {
|
||||||
|
// Specify a name for the automatically created VNIC datalink.
|
||||||
|
Linkname string `json:"linkname,omitempty"`
|
||||||
|
// Specify the link over which the VNIC will be created.
|
||||||
|
Lowerlink string `json:"lowerLink,omitempty"`
|
||||||
|
// The set of IP addresses that the container can use.
|
||||||
|
Allowedaddr string `json:"allowedAddress,omitempty"`
|
||||||
|
// Specifies whether allowedAddress limitation is to be applied to the VNIC.
|
||||||
|
Configallowedaddr string `json:"configureAllowedAddress,omitempty"`
|
||||||
|
// The value of the optional default router.
|
||||||
|
Defrouter string `json:"defrouter,omitempty"`
|
||||||
|
// Enable one or more types of link protection.
|
||||||
|
Linkprotection string `json:"linkProtection,omitempty"`
|
||||||
|
// Set the VNIC's macAddress
|
||||||
|
Macaddress string `json:"macAddress,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arch used for additional architectures
|
||||||
|
type Arch string
|
||||||
|
|
||||||
|
// Additional architectures permitted to be used for system calls
|
||||||
|
// By default only the native architecture of the kernel is permitted
|
||||||
|
const (
|
||||||
|
ArchX86 Arch = "SCMP_ARCH_X86"
|
||||||
|
ArchX86_64 Arch = "SCMP_ARCH_X86_64"
|
||||||
|
ArchX32 Arch = "SCMP_ARCH_X32"
|
||||||
|
ArchARM Arch = "SCMP_ARCH_ARM"
|
||||||
|
ArchAARCH64 Arch = "SCMP_ARCH_AARCH64"
|
||||||
|
ArchMIPS Arch = "SCMP_ARCH_MIPS"
|
||||||
|
ArchMIPS64 Arch = "SCMP_ARCH_MIPS64"
|
||||||
|
ArchMIPS64N32 Arch = "SCMP_ARCH_MIPS64N32"
|
||||||
|
ArchMIPSEL Arch = "SCMP_ARCH_MIPSEL"
|
||||||
|
ArchMIPSEL64 Arch = "SCMP_ARCH_MIPSEL64"
|
||||||
|
ArchMIPSEL64N32 Arch = "SCMP_ARCH_MIPSEL64N32"
|
||||||
|
ArchPPC Arch = "SCMP_ARCH_PPC"
|
||||||
|
ArchPPC64 Arch = "SCMP_ARCH_PPC64"
|
||||||
|
ArchPPC64LE Arch = "SCMP_ARCH_PPC64LE"
|
||||||
|
ArchS390 Arch = "SCMP_ARCH_S390"
|
||||||
|
ArchS390X Arch = "SCMP_ARCH_S390X"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Action taken upon Seccomp rule match
|
||||||
|
type Action string
|
||||||
|
|
||||||
|
// Define actions for Seccomp rules
|
||||||
|
const (
|
||||||
|
ActKill Action = "SCMP_ACT_KILL"
|
||||||
|
ActTrap Action = "SCMP_ACT_TRAP"
|
||||||
|
ActErrno Action = "SCMP_ACT_ERRNO"
|
||||||
|
ActTrace Action = "SCMP_ACT_TRACE"
|
||||||
|
ActAllow Action = "SCMP_ACT_ALLOW"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Operator used to match syscall arguments in Seccomp
|
||||||
|
type Operator string
|
||||||
|
|
||||||
|
// Define operators for syscall arguments in Seccomp
|
||||||
|
const (
|
||||||
|
OpNotEqual Operator = "SCMP_CMP_NE"
|
||||||
|
OpLessThan Operator = "SCMP_CMP_LT"
|
||||||
|
OpLessEqual Operator = "SCMP_CMP_LE"
|
||||||
|
OpEqualTo Operator = "SCMP_CMP_EQ"
|
||||||
|
OpGreaterEqual Operator = "SCMP_CMP_GE"
|
||||||
|
OpGreaterThan Operator = "SCMP_CMP_GT"
|
||||||
|
OpMaskedEqual Operator = "SCMP_CMP_MASKED_EQ"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Arg used for matching specific syscall arguments in Seccomp
|
||||||
|
type Arg struct {
|
||||||
|
Index uint `json:"index"`
|
||||||
|
Value uint64 `json:"value"`
|
||||||
|
ValueTwo uint64 `json:"valueTwo"`
|
||||||
|
Op Operator `json:"op"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Syscall is used to match a syscall in Seccomp
|
||||||
|
type Syscall struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Action Action `json:"action"`
|
||||||
|
Args []Arg `json:"args,omitempty"`
|
||||||
|
}
|
17
vendor/github.com/opencontainers/runtime-spec/specs-go/state.go
generated
vendored
Normal file
17
vendor/github.com/opencontainers/runtime-spec/specs-go/state.go
generated
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
package specs
|
||||||
|
|
||||||
|
// State holds information about the runtime state of the container.
|
||||||
|
type State struct {
|
||||||
|
// Version is the version of the specification that is supported.
|
||||||
|
Version string `json:"version"`
|
||||||
|
// ID is the container ID
|
||||||
|
ID string `json:"id"`
|
||||||
|
// Status is the runtime state of the container.
|
||||||
|
Status string `json:"status"`
|
||||||
|
// Pid is the process id for the container's main process.
|
||||||
|
Pid int `json:"pid"`
|
||||||
|
// BundlePath is the path to the container's bundle directory.
|
||||||
|
BundlePath string `json:"bundlePath"`
|
||||||
|
// Annotations are the annotations associated with the container.
|
||||||
|
Annotations map[string]string `json:"annotations"`
|
||||||
|
}
|
18
vendor/github.com/opencontainers/runtime-spec/specs-go/version.go
generated
vendored
Normal file
18
vendor/github.com/opencontainers/runtime-spec/specs-go/version.go
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package specs
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
const (
|
||||||
|
// VersionMajor is for an API incompatible changes
|
||||||
|
VersionMajor = 1
|
||||||
|
// VersionMinor is for functionality in a backwards-compatible manner
|
||||||
|
VersionMinor = 0
|
||||||
|
// VersionPatch is for backwards-compatible bug fixes
|
||||||
|
VersionPatch = 0
|
||||||
|
|
||||||
|
// VersionDev indicates development branch. Releases will be empty string.
|
||||||
|
VersionDev = "-rc1-dev"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Version is the specification version that the package types support.
|
||||||
|
var Version = fmt.Sprintf("%d.%d.%d%s", VersionMajor, VersionMinor, VersionPatch, VersionDev)
|
24
vendor/github.com/syndtr/gocapability/LICENSE
generated
vendored
Normal file
24
vendor/github.com/syndtr/gocapability/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
Copyright 2013 Suryandaru Triandana <syndtr@gmail.com>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
72
vendor/github.com/syndtr/gocapability/capability/capability.go
generated
vendored
Normal file
72
vendor/github.com/syndtr/gocapability/capability/capability.go
generated
vendored
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package capability provides utilities for manipulating POSIX capabilities.
|
||||||
|
package capability
|
||||||
|
|
||||||
|
type Capabilities interface {
|
||||||
|
// Get check whether a capability present in the given
|
||||||
|
// capabilities set. The 'which' value should be one of EFFECTIVE,
|
||||||
|
// PERMITTED, INHERITABLE or BOUNDING.
|
||||||
|
Get(which CapType, what Cap) bool
|
||||||
|
|
||||||
|
// Empty check whether all capability bits of the given capabilities
|
||||||
|
// set are zero. The 'which' value should be one of EFFECTIVE,
|
||||||
|
// PERMITTED, INHERITABLE or BOUNDING.
|
||||||
|
Empty(which CapType) bool
|
||||||
|
|
||||||
|
// Full check whether all capability bits of the given capabilities
|
||||||
|
// set are one. The 'which' value should be one of EFFECTIVE,
|
||||||
|
// PERMITTED, INHERITABLE or BOUNDING.
|
||||||
|
Full(which CapType) bool
|
||||||
|
|
||||||
|
// Set sets capabilities of the given capabilities sets. The
|
||||||
|
// 'which' value should be one or combination (OR'ed) of EFFECTIVE,
|
||||||
|
// PERMITTED, INHERITABLE or BOUNDING.
|
||||||
|
Set(which CapType, caps ...Cap)
|
||||||
|
|
||||||
|
// Unset unsets capabilities of the given capabilities sets. The
|
||||||
|
// 'which' value should be one or combination (OR'ed) of EFFECTIVE,
|
||||||
|
// PERMITTED, INHERITABLE or BOUNDING.
|
||||||
|
Unset(which CapType, caps ...Cap)
|
||||||
|
|
||||||
|
// Fill sets all bits of the given capabilities kind to one. The
|
||||||
|
// 'kind' value should be one or combination (OR'ed) of CAPS or
|
||||||
|
// BOUNDS.
|
||||||
|
Fill(kind CapType)
|
||||||
|
|
||||||
|
// Clear sets all bits of the given capabilities kind to zero. The
|
||||||
|
// 'kind' value should be one or combination (OR'ed) of CAPS or
|
||||||
|
// BOUNDS.
|
||||||
|
Clear(kind CapType)
|
||||||
|
|
||||||
|
// String return current capabilities state of the given capabilities
|
||||||
|
// set as string. The 'which' value should be one of EFFECTIVE,
|
||||||
|
// PERMITTED, INHERITABLE or BOUNDING.
|
||||||
|
StringCap(which CapType) string
|
||||||
|
|
||||||
|
// String return current capabilities state as string.
|
||||||
|
String() string
|
||||||
|
|
||||||
|
// Load load actual capabilities value. This will overwrite all
|
||||||
|
// outstanding changes.
|
||||||
|
Load() error
|
||||||
|
|
||||||
|
// Apply apply the capabilities settings, so all changes will take
|
||||||
|
// effect.
|
||||||
|
Apply(kind CapType) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewPid create new initialized Capabilities object for given pid when it
|
||||||
|
// is nonzero, or for the current pid if pid is 0
|
||||||
|
func NewPid(pid int) (Capabilities, error) {
|
||||||
|
return newPid(pid)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFile create new initialized Capabilities object for given named file.
|
||||||
|
func NewFile(name string) (Capabilities, error) {
|
||||||
|
return newFile(name)
|
||||||
|
}
|
608
vendor/github.com/syndtr/gocapability/capability/capability_linux.go
generated
vendored
Normal file
608
vendor/github.com/syndtr/gocapability/capability/capability_linux.go
generated
vendored
Normal file
|
@ -0,0 +1,608 @@
|
||||||
|
// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
package capability
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
var errUnknownVers = errors.New("unknown capability version")
|
||||||
|
|
||||||
|
const (
|
||||||
|
linuxCapVer1 = 0x19980330
|
||||||
|
linuxCapVer2 = 0x20071026
|
||||||
|
linuxCapVer3 = 0x20080522
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
capVers uint32
|
||||||
|
capLastCap Cap
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var hdr capHeader
|
||||||
|
capget(&hdr, nil)
|
||||||
|
capVers = hdr.version
|
||||||
|
|
||||||
|
if initLastCap() == nil {
|
||||||
|
CAP_LAST_CAP = capLastCap
|
||||||
|
if capLastCap > 31 {
|
||||||
|
capUpperMask = (uint32(1) << (uint(capLastCap) - 31)) - 1
|
||||||
|
} else {
|
||||||
|
capUpperMask = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func initLastCap() error {
|
||||||
|
if capLastCap != 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Open("/proc/sys/kernel/cap_last_cap")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
var b []byte = make([]byte, 11)
|
||||||
|
_, err = f.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Sscanf(string(b), "%d", &capLastCap)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func mkStringCap(c Capabilities, which CapType) (ret string) {
|
||||||
|
for i, first := Cap(0), true; i <= CAP_LAST_CAP; i++ {
|
||||||
|
if !c.Get(which, i) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if first {
|
||||||
|
first = false
|
||||||
|
} else {
|
||||||
|
ret += ", "
|
||||||
|
}
|
||||||
|
ret += i.String()
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func mkString(c Capabilities, max CapType) (ret string) {
|
||||||
|
ret = "{"
|
||||||
|
for i := CapType(1); i <= max; i <<= 1 {
|
||||||
|
ret += " " + i.String() + "=\""
|
||||||
|
if c.Empty(i) {
|
||||||
|
ret += "empty"
|
||||||
|
} else if c.Full(i) {
|
||||||
|
ret += "full"
|
||||||
|
} else {
|
||||||
|
ret += c.StringCap(i)
|
||||||
|
}
|
||||||
|
ret += "\""
|
||||||
|
}
|
||||||
|
ret += " }"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func newPid(pid int) (c Capabilities, err error) {
|
||||||
|
switch capVers {
|
||||||
|
case linuxCapVer1:
|
||||||
|
p := new(capsV1)
|
||||||
|
p.hdr.version = capVers
|
||||||
|
p.hdr.pid = pid
|
||||||
|
c = p
|
||||||
|
case linuxCapVer2, linuxCapVer3:
|
||||||
|
p := new(capsV3)
|
||||||
|
p.hdr.version = capVers
|
||||||
|
p.hdr.pid = pid
|
||||||
|
c = p
|
||||||
|
default:
|
||||||
|
err = errUnknownVers
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = c.Load()
|
||||||
|
if err != nil {
|
||||||
|
c = nil
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type capsV1 struct {
|
||||||
|
hdr capHeader
|
||||||
|
data capData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Get(which CapType, what Cap) bool {
|
||||||
|
if what > 32 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
switch which {
|
||||||
|
case EFFECTIVE:
|
||||||
|
return (1<<uint(what))&c.data.effective != 0
|
||||||
|
case PERMITTED:
|
||||||
|
return (1<<uint(what))&c.data.permitted != 0
|
||||||
|
case INHERITABLE:
|
||||||
|
return (1<<uint(what))&c.data.inheritable != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) getData(which CapType) (ret uint32) {
|
||||||
|
switch which {
|
||||||
|
case EFFECTIVE:
|
||||||
|
ret = c.data.effective
|
||||||
|
case PERMITTED:
|
||||||
|
ret = c.data.permitted
|
||||||
|
case INHERITABLE:
|
||||||
|
ret = c.data.inheritable
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Empty(which CapType) bool {
|
||||||
|
return c.getData(which) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Full(which CapType) bool {
|
||||||
|
return (c.getData(which) & 0x7fffffff) == 0x7fffffff
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Set(which CapType, caps ...Cap) {
|
||||||
|
for _, what := range caps {
|
||||||
|
if what > 32 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if which&EFFECTIVE != 0 {
|
||||||
|
c.data.effective |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
if which&PERMITTED != 0 {
|
||||||
|
c.data.permitted |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
if which&INHERITABLE != 0 {
|
||||||
|
c.data.inheritable |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Unset(which CapType, caps ...Cap) {
|
||||||
|
for _, what := range caps {
|
||||||
|
if what > 32 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if which&EFFECTIVE != 0 {
|
||||||
|
c.data.effective &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
if which&PERMITTED != 0 {
|
||||||
|
c.data.permitted &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
if which&INHERITABLE != 0 {
|
||||||
|
c.data.inheritable &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Fill(kind CapType) {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
c.data.effective = 0x7fffffff
|
||||||
|
c.data.permitted = 0x7fffffff
|
||||||
|
c.data.inheritable = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Clear(kind CapType) {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
c.data.effective = 0
|
||||||
|
c.data.permitted = 0
|
||||||
|
c.data.inheritable = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) StringCap(which CapType) (ret string) {
|
||||||
|
return mkStringCap(c, which)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) String() (ret string) {
|
||||||
|
return mkString(c, BOUNDING)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Load() (err error) {
|
||||||
|
return capget(&c.hdr, &c.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV1) Apply(kind CapType) error {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
return capset(&c.hdr, &c.data)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type capsV3 struct {
|
||||||
|
hdr capHeader
|
||||||
|
data [2]capData
|
||||||
|
bounds [2]uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Get(which CapType, what Cap) bool {
|
||||||
|
var i uint
|
||||||
|
if what > 31 {
|
||||||
|
i = uint(what) >> 5
|
||||||
|
what %= 32
|
||||||
|
}
|
||||||
|
|
||||||
|
switch which {
|
||||||
|
case EFFECTIVE:
|
||||||
|
return (1<<uint(what))&c.data[i].effective != 0
|
||||||
|
case PERMITTED:
|
||||||
|
return (1<<uint(what))&c.data[i].permitted != 0
|
||||||
|
case INHERITABLE:
|
||||||
|
return (1<<uint(what))&c.data[i].inheritable != 0
|
||||||
|
case BOUNDING:
|
||||||
|
return (1<<uint(what))&c.bounds[i] != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) getData(which CapType, dest []uint32) {
|
||||||
|
switch which {
|
||||||
|
case EFFECTIVE:
|
||||||
|
dest[0] = c.data[0].effective
|
||||||
|
dest[1] = c.data[1].effective
|
||||||
|
case PERMITTED:
|
||||||
|
dest[0] = c.data[0].permitted
|
||||||
|
dest[1] = c.data[1].permitted
|
||||||
|
case INHERITABLE:
|
||||||
|
dest[0] = c.data[0].inheritable
|
||||||
|
dest[1] = c.data[1].inheritable
|
||||||
|
case BOUNDING:
|
||||||
|
dest[0] = c.bounds[0]
|
||||||
|
dest[1] = c.bounds[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Empty(which CapType) bool {
|
||||||
|
var data [2]uint32
|
||||||
|
c.getData(which, data[:])
|
||||||
|
return data[0] == 0 && data[1] == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Full(which CapType) bool {
|
||||||
|
var data [2]uint32
|
||||||
|
c.getData(which, data[:])
|
||||||
|
if (data[0] & 0xffffffff) != 0xffffffff {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return (data[1] & capUpperMask) == capUpperMask
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Set(which CapType, caps ...Cap) {
|
||||||
|
for _, what := range caps {
|
||||||
|
var i uint
|
||||||
|
if what > 31 {
|
||||||
|
i = uint(what) >> 5
|
||||||
|
what %= 32
|
||||||
|
}
|
||||||
|
|
||||||
|
if which&EFFECTIVE != 0 {
|
||||||
|
c.data[i].effective |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
if which&PERMITTED != 0 {
|
||||||
|
c.data[i].permitted |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
if which&INHERITABLE != 0 {
|
||||||
|
c.data[i].inheritable |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
if which&BOUNDING != 0 {
|
||||||
|
c.bounds[i] |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Unset(which CapType, caps ...Cap) {
|
||||||
|
for _, what := range caps {
|
||||||
|
var i uint
|
||||||
|
if what > 31 {
|
||||||
|
i = uint(what) >> 5
|
||||||
|
what %= 32
|
||||||
|
}
|
||||||
|
|
||||||
|
if which&EFFECTIVE != 0 {
|
||||||
|
c.data[i].effective &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
if which&PERMITTED != 0 {
|
||||||
|
c.data[i].permitted &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
if which&INHERITABLE != 0 {
|
||||||
|
c.data[i].inheritable &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
if which&BOUNDING != 0 {
|
||||||
|
c.bounds[i] &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Fill(kind CapType) {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
c.data[0].effective = 0xffffffff
|
||||||
|
c.data[0].permitted = 0xffffffff
|
||||||
|
c.data[0].inheritable = 0
|
||||||
|
c.data[1].effective = 0xffffffff
|
||||||
|
c.data[1].permitted = 0xffffffff
|
||||||
|
c.data[1].inheritable = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if kind&BOUNDS == BOUNDS {
|
||||||
|
c.bounds[0] = 0xffffffff
|
||||||
|
c.bounds[1] = 0xffffffff
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Clear(kind CapType) {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
c.data[0].effective = 0
|
||||||
|
c.data[0].permitted = 0
|
||||||
|
c.data[0].inheritable = 0
|
||||||
|
c.data[1].effective = 0
|
||||||
|
c.data[1].permitted = 0
|
||||||
|
c.data[1].inheritable = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if kind&BOUNDS == BOUNDS {
|
||||||
|
c.bounds[0] = 0
|
||||||
|
c.bounds[1] = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) StringCap(which CapType) (ret string) {
|
||||||
|
return mkStringCap(c, which)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) String() (ret string) {
|
||||||
|
return mkString(c, BOUNDING)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Load() (err error) {
|
||||||
|
err = capget(&c.hdr, &c.data[0])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var status_path string
|
||||||
|
|
||||||
|
if c.hdr.pid == 0 {
|
||||||
|
status_path = fmt.Sprintf("/proc/self/status")
|
||||||
|
} else {
|
||||||
|
status_path = fmt.Sprintf("/proc/%d/status", c.hdr.pid)
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Open(status_path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b := bufio.NewReader(f)
|
||||||
|
for {
|
||||||
|
line, e := b.ReadString('\n')
|
||||||
|
if e != nil {
|
||||||
|
if e != io.EOF {
|
||||||
|
err = e
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(line, "CapB") {
|
||||||
|
fmt.Sscanf(line[4:], "nd: %08x%08x", &c.bounds[1], &c.bounds[0])
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsV3) Apply(kind CapType) (err error) {
|
||||||
|
if kind&BOUNDS == BOUNDS {
|
||||||
|
var data [2]capData
|
||||||
|
err = capget(&c.hdr, &data[0])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (1<<uint(CAP_SETPCAP))&data[0].effective != 0 {
|
||||||
|
for i := Cap(0); i <= CAP_LAST_CAP; i++ {
|
||||||
|
if c.Get(BOUNDING, i) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err = prctl(syscall.PR_CAPBSET_DROP, uintptr(i), 0, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
// Ignore EINVAL since the capability may not be supported in this system.
|
||||||
|
if errno, ok := err.(syscall.Errno); ok && errno == syscall.EINVAL {
|
||||||
|
err = nil
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
return capset(&c.hdr, &c.data[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func newFile(path string) (c Capabilities, err error) {
|
||||||
|
c = &capsFile{path: path}
|
||||||
|
err = c.Load()
|
||||||
|
if err != nil {
|
||||||
|
c = nil
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type capsFile struct {
|
||||||
|
path string
|
||||||
|
data vfscapData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Get(which CapType, what Cap) bool {
|
||||||
|
var i uint
|
||||||
|
if what > 31 {
|
||||||
|
if c.data.version == 1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
i = uint(what) >> 5
|
||||||
|
what %= 32
|
||||||
|
}
|
||||||
|
|
||||||
|
switch which {
|
||||||
|
case EFFECTIVE:
|
||||||
|
return (1<<uint(what))&c.data.effective[i] != 0
|
||||||
|
case PERMITTED:
|
||||||
|
return (1<<uint(what))&c.data.data[i].permitted != 0
|
||||||
|
case INHERITABLE:
|
||||||
|
return (1<<uint(what))&c.data.data[i].inheritable != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) getData(which CapType, dest []uint32) {
|
||||||
|
switch which {
|
||||||
|
case EFFECTIVE:
|
||||||
|
dest[0] = c.data.effective[0]
|
||||||
|
dest[1] = c.data.effective[1]
|
||||||
|
case PERMITTED:
|
||||||
|
dest[0] = c.data.data[0].permitted
|
||||||
|
dest[1] = c.data.data[1].permitted
|
||||||
|
case INHERITABLE:
|
||||||
|
dest[0] = c.data.data[0].inheritable
|
||||||
|
dest[1] = c.data.data[1].inheritable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Empty(which CapType) bool {
|
||||||
|
var data [2]uint32
|
||||||
|
c.getData(which, data[:])
|
||||||
|
return data[0] == 0 && data[1] == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Full(which CapType) bool {
|
||||||
|
var data [2]uint32
|
||||||
|
c.getData(which, data[:])
|
||||||
|
if c.data.version == 0 {
|
||||||
|
return (data[0] & 0x7fffffff) == 0x7fffffff
|
||||||
|
}
|
||||||
|
if (data[0] & 0xffffffff) != 0xffffffff {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return (data[1] & capUpperMask) == capUpperMask
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Set(which CapType, caps ...Cap) {
|
||||||
|
for _, what := range caps {
|
||||||
|
var i uint
|
||||||
|
if what > 31 {
|
||||||
|
if c.data.version == 1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
i = uint(what) >> 5
|
||||||
|
what %= 32
|
||||||
|
}
|
||||||
|
|
||||||
|
if which&EFFECTIVE != 0 {
|
||||||
|
c.data.effective[i] |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
if which&PERMITTED != 0 {
|
||||||
|
c.data.data[i].permitted |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
if which&INHERITABLE != 0 {
|
||||||
|
c.data.data[i].inheritable |= 1 << uint(what)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Unset(which CapType, caps ...Cap) {
|
||||||
|
for _, what := range caps {
|
||||||
|
var i uint
|
||||||
|
if what > 31 {
|
||||||
|
if c.data.version == 1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
i = uint(what) >> 5
|
||||||
|
what %= 32
|
||||||
|
}
|
||||||
|
|
||||||
|
if which&EFFECTIVE != 0 {
|
||||||
|
c.data.effective[i] &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
if which&PERMITTED != 0 {
|
||||||
|
c.data.data[i].permitted &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
if which&INHERITABLE != 0 {
|
||||||
|
c.data.data[i].inheritable &= ^(1 << uint(what))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Fill(kind CapType) {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
c.data.effective[0] = 0xffffffff
|
||||||
|
c.data.data[0].permitted = 0xffffffff
|
||||||
|
c.data.data[0].inheritable = 0
|
||||||
|
if c.data.version == 2 {
|
||||||
|
c.data.effective[1] = 0xffffffff
|
||||||
|
c.data.data[1].permitted = 0xffffffff
|
||||||
|
c.data.data[1].inheritable = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Clear(kind CapType) {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
c.data.effective[0] = 0
|
||||||
|
c.data.data[0].permitted = 0
|
||||||
|
c.data.data[0].inheritable = 0
|
||||||
|
if c.data.version == 2 {
|
||||||
|
c.data.effective[1] = 0
|
||||||
|
c.data.data[1].permitted = 0
|
||||||
|
c.data.data[1].inheritable = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) StringCap(which CapType) (ret string) {
|
||||||
|
return mkStringCap(c, which)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) String() (ret string) {
|
||||||
|
return mkString(c, INHERITABLE)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Load() (err error) {
|
||||||
|
return getVfsCap(c.path, &c.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *capsFile) Apply(kind CapType) (err error) {
|
||||||
|
if kind&CAPS == CAPS {
|
||||||
|
return setVfsCap(c.path, &c.data)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
19
vendor/github.com/syndtr/gocapability/capability/capability_noop.go
generated
vendored
Normal file
19
vendor/github.com/syndtr/gocapability/capability/capability_noop.go
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package capability
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
func newPid(pid int) (Capabilities, error) {
|
||||||
|
return nil, errors.New("not supported")
|
||||||
|
}
|
||||||
|
|
||||||
|
func newFile(path string) (Capabilities, error) {
|
||||||
|
return nil, errors.New("not supported")
|
||||||
|
}
|
264
vendor/github.com/syndtr/gocapability/capability/enum.go
generated
vendored
Normal file
264
vendor/github.com/syndtr/gocapability/capability/enum.go
generated
vendored
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
package capability
|
||||||
|
|
||||||
|
type CapType uint
|
||||||
|
|
||||||
|
func (c CapType) String() string {
|
||||||
|
switch c {
|
||||||
|
case EFFECTIVE:
|
||||||
|
return "effective"
|
||||||
|
case PERMITTED:
|
||||||
|
return "permitted"
|
||||||
|
case INHERITABLE:
|
||||||
|
return "inheritable"
|
||||||
|
case BOUNDING:
|
||||||
|
return "bounding"
|
||||||
|
case CAPS:
|
||||||
|
return "caps"
|
||||||
|
}
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
EFFECTIVE CapType = 1 << iota
|
||||||
|
PERMITTED
|
||||||
|
INHERITABLE
|
||||||
|
BOUNDING
|
||||||
|
|
||||||
|
CAPS = EFFECTIVE | PERMITTED | INHERITABLE
|
||||||
|
BOUNDS = BOUNDING
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:generate go run enumgen/gen.go
|
||||||
|
type Cap int
|
||||||
|
|
||||||
|
// POSIX-draft defined capabilities.
|
||||||
|
const (
|
||||||
|
// In a system with the [_POSIX_CHOWN_RESTRICTED] option defined, this
|
||||||
|
// overrides the restriction of changing file ownership and group
|
||||||
|
// ownership.
|
||||||
|
CAP_CHOWN = Cap(0)
|
||||||
|
|
||||||
|
// Override all DAC access, including ACL execute access if
|
||||||
|
// [_POSIX_ACL] is defined. Excluding DAC access covered by
|
||||||
|
// CAP_LINUX_IMMUTABLE.
|
||||||
|
CAP_DAC_OVERRIDE = Cap(1)
|
||||||
|
|
||||||
|
// Overrides all DAC restrictions regarding read and search on files
|
||||||
|
// and directories, including ACL restrictions if [_POSIX_ACL] is
|
||||||
|
// defined. Excluding DAC access covered by CAP_LINUX_IMMUTABLE.
|
||||||
|
CAP_DAC_READ_SEARCH = Cap(2)
|
||||||
|
|
||||||
|
// Overrides all restrictions about allowed operations on files, where
|
||||||
|
// file owner ID must be equal to the user ID, except where CAP_FSETID
|
||||||
|
// is applicable. It doesn't override MAC and DAC restrictions.
|
||||||
|
CAP_FOWNER = Cap(3)
|
||||||
|
|
||||||
|
// Overrides the following restrictions that the effective user ID
|
||||||
|
// shall match the file owner ID when setting the S_ISUID and S_ISGID
|
||||||
|
// bits on that file; that the effective group ID (or one of the
|
||||||
|
// supplementary group IDs) shall match the file owner ID when setting
|
||||||
|
// the S_ISGID bit on that file; that the S_ISUID and S_ISGID bits are
|
||||||
|
// cleared on successful return from chown(2) (not implemented).
|
||||||
|
CAP_FSETID = Cap(4)
|
||||||
|
|
||||||
|
// Overrides the restriction that the real or effective user ID of a
|
||||||
|
// process sending a signal must match the real or effective user ID
|
||||||
|
// of the process receiving the signal.
|
||||||
|
CAP_KILL = Cap(5)
|
||||||
|
|
||||||
|
// Allows setgid(2) manipulation
|
||||||
|
// Allows setgroups(2)
|
||||||
|
// Allows forged gids on socket credentials passing.
|
||||||
|
CAP_SETGID = Cap(6)
|
||||||
|
|
||||||
|
// Allows set*uid(2) manipulation (including fsuid).
|
||||||
|
// Allows forged pids on socket credentials passing.
|
||||||
|
CAP_SETUID = Cap(7)
|
||||||
|
|
||||||
|
// Linux-specific capabilities
|
||||||
|
|
||||||
|
// Without VFS support for capabilities:
|
||||||
|
// Transfer any capability in your permitted set to any pid,
|
||||||
|
// remove any capability in your permitted set from any pid
|
||||||
|
// With VFS support for capabilities (neither of above, but)
|
||||||
|
// Add any capability from current's capability bounding set
|
||||||
|
// to the current process' inheritable set
|
||||||
|
// Allow taking bits out of capability bounding set
|
||||||
|
// Allow modification of the securebits for a process
|
||||||
|
CAP_SETPCAP = Cap(8)
|
||||||
|
|
||||||
|
// Allow modification of S_IMMUTABLE and S_APPEND file attributes
|
||||||
|
CAP_LINUX_IMMUTABLE = Cap(9)
|
||||||
|
|
||||||
|
// Allows binding to TCP/UDP sockets below 1024
|
||||||
|
// Allows binding to ATM VCIs below 32
|
||||||
|
CAP_NET_BIND_SERVICE = Cap(10)
|
||||||
|
|
||||||
|
// Allow broadcasting, listen to multicast
|
||||||
|
CAP_NET_BROADCAST = Cap(11)
|
||||||
|
|
||||||
|
// Allow interface configuration
|
||||||
|
// Allow administration of IP firewall, masquerading and accounting
|
||||||
|
// Allow setting debug option on sockets
|
||||||
|
// Allow modification of routing tables
|
||||||
|
// Allow setting arbitrary process / process group ownership on
|
||||||
|
// sockets
|
||||||
|
// Allow binding to any address for transparent proxying (also via NET_RAW)
|
||||||
|
// Allow setting TOS (type of service)
|
||||||
|
// Allow setting promiscuous mode
|
||||||
|
// Allow clearing driver statistics
|
||||||
|
// Allow multicasting
|
||||||
|
// Allow read/write of device-specific registers
|
||||||
|
// Allow activation of ATM control sockets
|
||||||
|
CAP_NET_ADMIN = Cap(12)
|
||||||
|
|
||||||
|
// Allow use of RAW sockets
|
||||||
|
// Allow use of PACKET sockets
|
||||||
|
// Allow binding to any address for transparent proxying (also via NET_ADMIN)
|
||||||
|
CAP_NET_RAW = Cap(13)
|
||||||
|
|
||||||
|
// Allow locking of shared memory segments
|
||||||
|
// Allow mlock and mlockall (which doesn't really have anything to do
|
||||||
|
// with IPC)
|
||||||
|
CAP_IPC_LOCK = Cap(14)
|
||||||
|
|
||||||
|
// Override IPC ownership checks
|
||||||
|
CAP_IPC_OWNER = Cap(15)
|
||||||
|
|
||||||
|
// Insert and remove kernel modules - modify kernel without limit
|
||||||
|
CAP_SYS_MODULE = Cap(16)
|
||||||
|
|
||||||
|
// Allow ioperm/iopl access
|
||||||
|
// Allow sending USB messages to any device via /proc/bus/usb
|
||||||
|
CAP_SYS_RAWIO = Cap(17)
|
||||||
|
|
||||||
|
// Allow use of chroot()
|
||||||
|
CAP_SYS_CHROOT = Cap(18)
|
||||||
|
|
||||||
|
// Allow ptrace() of any process
|
||||||
|
CAP_SYS_PTRACE = Cap(19)
|
||||||
|
|
||||||
|
// Allow configuration of process accounting
|
||||||
|
CAP_SYS_PACCT = Cap(20)
|
||||||
|
|
||||||
|
// Allow configuration of the secure attention key
|
||||||
|
// Allow administration of the random device
|
||||||
|
// Allow examination and configuration of disk quotas
|
||||||
|
// Allow setting the domainname
|
||||||
|
// Allow setting the hostname
|
||||||
|
// Allow calling bdflush()
|
||||||
|
// Allow mount() and umount(), setting up new smb connection
|
||||||
|
// Allow some autofs root ioctls
|
||||||
|
// Allow nfsservctl
|
||||||
|
// Allow VM86_REQUEST_IRQ
|
||||||
|
// Allow to read/write pci config on alpha
|
||||||
|
// Allow irix_prctl on mips (setstacksize)
|
||||||
|
// Allow flushing all cache on m68k (sys_cacheflush)
|
||||||
|
// Allow removing semaphores
|
||||||
|
// Used instead of CAP_CHOWN to "chown" IPC message queues, semaphores
|
||||||
|
// and shared memory
|
||||||
|
// Allow locking/unlocking of shared memory segment
|
||||||
|
// Allow turning swap on/off
|
||||||
|
// Allow forged pids on socket credentials passing
|
||||||
|
// Allow setting readahead and flushing buffers on block devices
|
||||||
|
// Allow setting geometry in floppy driver
|
||||||
|
// Allow turning DMA on/off in xd driver
|
||||||
|
// Allow administration of md devices (mostly the above, but some
|
||||||
|
// extra ioctls)
|
||||||
|
// Allow tuning the ide driver
|
||||||
|
// Allow access to the nvram device
|
||||||
|
// Allow administration of apm_bios, serial and bttv (TV) device
|
||||||
|
// Allow manufacturer commands in isdn CAPI support driver
|
||||||
|
// Allow reading non-standardized portions of pci configuration space
|
||||||
|
// Allow DDI debug ioctl on sbpcd driver
|
||||||
|
// Allow setting up serial ports
|
||||||
|
// Allow sending raw qic-117 commands
|
||||||
|
// Allow enabling/disabling tagged queuing on SCSI controllers and sending
|
||||||
|
// arbitrary SCSI commands
|
||||||
|
// Allow setting encryption key on loopback filesystem
|
||||||
|
// Allow setting zone reclaim policy
|
||||||
|
CAP_SYS_ADMIN = Cap(21)
|
||||||
|
|
||||||
|
// Allow use of reboot()
|
||||||
|
CAP_SYS_BOOT = Cap(22)
|
||||||
|
|
||||||
|
// Allow raising priority and setting priority on other (different
|
||||||
|
// UID) processes
|
||||||
|
// Allow use of FIFO and round-robin (realtime) scheduling on own
|
||||||
|
// processes and setting the scheduling algorithm used by another
|
||||||
|
// process.
|
||||||
|
// Allow setting cpu affinity on other processes
|
||||||
|
CAP_SYS_NICE = Cap(23)
|
||||||
|
|
||||||
|
// Override resource limits. Set resource limits.
|
||||||
|
// Override quota limits.
|
||||||
|
// Override reserved space on ext2 filesystem
|
||||||
|
// Modify data journaling mode on ext3 filesystem (uses journaling
|
||||||
|
// resources)
|
||||||
|
// NOTE: ext2 honors fsuid when checking for resource overrides, so
|
||||||
|
// you can override using fsuid too
|
||||||
|
// Override size restrictions on IPC message queues
|
||||||
|
// Allow more than 64hz interrupts from the real-time clock
|
||||||
|
// Override max number of consoles on console allocation
|
||||||
|
// Override max number of keymaps
|
||||||
|
CAP_SYS_RESOURCE = Cap(24)
|
||||||
|
|
||||||
|
// Allow manipulation of system clock
|
||||||
|
// Allow irix_stime on mips
|
||||||
|
// Allow setting the real-time clock
|
||||||
|
CAP_SYS_TIME = Cap(25)
|
||||||
|
|
||||||
|
// Allow configuration of tty devices
|
||||||
|
// Allow vhangup() of tty
|
||||||
|
CAP_SYS_TTY_CONFIG = Cap(26)
|
||||||
|
|
||||||
|
// Allow the privileged aspects of mknod()
|
||||||
|
CAP_MKNOD = Cap(27)
|
||||||
|
|
||||||
|
// Allow taking of leases on files
|
||||||
|
CAP_LEASE = Cap(28)
|
||||||
|
|
||||||
|
CAP_AUDIT_WRITE = Cap(29)
|
||||||
|
CAP_AUDIT_CONTROL = Cap(30)
|
||||||
|
CAP_SETFCAP = Cap(31)
|
||||||
|
|
||||||
|
// Override MAC access.
|
||||||
|
// The base kernel enforces no MAC policy.
|
||||||
|
// An LSM may enforce a MAC policy, and if it does and it chooses
|
||||||
|
// to implement capability based overrides of that policy, this is
|
||||||
|
// the capability it should use to do so.
|
||||||
|
CAP_MAC_OVERRIDE = Cap(32)
|
||||||
|
|
||||||
|
// Allow MAC configuration or state changes.
|
||||||
|
// The base kernel requires no MAC configuration.
|
||||||
|
// An LSM may enforce a MAC policy, and if it does and it chooses
|
||||||
|
// to implement capability based checks on modifications to that
|
||||||
|
// policy or the data required to maintain it, this is the
|
||||||
|
// capability it should use to do so.
|
||||||
|
CAP_MAC_ADMIN = Cap(33)
|
||||||
|
|
||||||
|
// Allow configuring the kernel's syslog (printk behaviour)
|
||||||
|
CAP_SYSLOG = Cap(34)
|
||||||
|
|
||||||
|
// Allow triggering something that will wake the system
|
||||||
|
CAP_WAKE_ALARM = Cap(35)
|
||||||
|
|
||||||
|
// Allow preventing system suspends
|
||||||
|
CAP_BLOCK_SUSPEND = Cap(36)
|
||||||
|
|
||||||
|
// Allow reading audit messages from the kernel
|
||||||
|
CAP_AUDIT_READ = Cap(37)
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Highest valid capability of the running kernel.
|
||||||
|
CAP_LAST_CAP = Cap(63)
|
||||||
|
|
||||||
|
capUpperMask = ^uint32(0)
|
||||||
|
)
|
129
vendor/github.com/syndtr/gocapability/capability/enum_gen.go
generated
vendored
Normal file
129
vendor/github.com/syndtr/gocapability/capability/enum_gen.go
generated
vendored
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
// generated file; DO NOT EDIT - use go generate in directory with source
|
||||||
|
|
||||||
|
package capability
|
||||||
|
|
||||||
|
func (c Cap) String() string {
|
||||||
|
switch c {
|
||||||
|
case CAP_CHOWN:
|
||||||
|
return "chown"
|
||||||
|
case CAP_DAC_OVERRIDE:
|
||||||
|
return "dac_override"
|
||||||
|
case CAP_DAC_READ_SEARCH:
|
||||||
|
return "dac_read_search"
|
||||||
|
case CAP_FOWNER:
|
||||||
|
return "fowner"
|
||||||
|
case CAP_FSETID:
|
||||||
|
return "fsetid"
|
||||||
|
case CAP_KILL:
|
||||||
|
return "kill"
|
||||||
|
case CAP_SETGID:
|
||||||
|
return "setgid"
|
||||||
|
case CAP_SETUID:
|
||||||
|
return "setuid"
|
||||||
|
case CAP_SETPCAP:
|
||||||
|
return "setpcap"
|
||||||
|
case CAP_LINUX_IMMUTABLE:
|
||||||
|
return "linux_immutable"
|
||||||
|
case CAP_NET_BIND_SERVICE:
|
||||||
|
return "net_bind_service"
|
||||||
|
case CAP_NET_BROADCAST:
|
||||||
|
return "net_broadcast"
|
||||||
|
case CAP_NET_ADMIN:
|
||||||
|
return "net_admin"
|
||||||
|
case CAP_NET_RAW:
|
||||||
|
return "net_raw"
|
||||||
|
case CAP_IPC_LOCK:
|
||||||
|
return "ipc_lock"
|
||||||
|
case CAP_IPC_OWNER:
|
||||||
|
return "ipc_owner"
|
||||||
|
case CAP_SYS_MODULE:
|
||||||
|
return "sys_module"
|
||||||
|
case CAP_SYS_RAWIO:
|
||||||
|
return "sys_rawio"
|
||||||
|
case CAP_SYS_CHROOT:
|
||||||
|
return "sys_chroot"
|
||||||
|
case CAP_SYS_PTRACE:
|
||||||
|
return "sys_ptrace"
|
||||||
|
case CAP_SYS_PACCT:
|
||||||
|
return "sys_pacct"
|
||||||
|
case CAP_SYS_ADMIN:
|
||||||
|
return "sys_admin"
|
||||||
|
case CAP_SYS_BOOT:
|
||||||
|
return "sys_boot"
|
||||||
|
case CAP_SYS_NICE:
|
||||||
|
return "sys_nice"
|
||||||
|
case CAP_SYS_RESOURCE:
|
||||||
|
return "sys_resource"
|
||||||
|
case CAP_SYS_TIME:
|
||||||
|
return "sys_time"
|
||||||
|
case CAP_SYS_TTY_CONFIG:
|
||||||
|
return "sys_tty_config"
|
||||||
|
case CAP_MKNOD:
|
||||||
|
return "mknod"
|
||||||
|
case CAP_LEASE:
|
||||||
|
return "lease"
|
||||||
|
case CAP_AUDIT_WRITE:
|
||||||
|
return "audit_write"
|
||||||
|
case CAP_AUDIT_CONTROL:
|
||||||
|
return "audit_control"
|
||||||
|
case CAP_SETFCAP:
|
||||||
|
return "setfcap"
|
||||||
|
case CAP_MAC_OVERRIDE:
|
||||||
|
return "mac_override"
|
||||||
|
case CAP_MAC_ADMIN:
|
||||||
|
return "mac_admin"
|
||||||
|
case CAP_SYSLOG:
|
||||||
|
return "syslog"
|
||||||
|
case CAP_WAKE_ALARM:
|
||||||
|
return "wake_alarm"
|
||||||
|
case CAP_BLOCK_SUSPEND:
|
||||||
|
return "block_suspend"
|
||||||
|
case CAP_AUDIT_READ:
|
||||||
|
return "audit_read"
|
||||||
|
}
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns list of all supported capabilities
|
||||||
|
func List() []Cap {
|
||||||
|
return []Cap{
|
||||||
|
CAP_CHOWN,
|
||||||
|
CAP_DAC_OVERRIDE,
|
||||||
|
CAP_DAC_READ_SEARCH,
|
||||||
|
CAP_FOWNER,
|
||||||
|
CAP_FSETID,
|
||||||
|
CAP_KILL,
|
||||||
|
CAP_SETGID,
|
||||||
|
CAP_SETUID,
|
||||||
|
CAP_SETPCAP,
|
||||||
|
CAP_LINUX_IMMUTABLE,
|
||||||
|
CAP_NET_BIND_SERVICE,
|
||||||
|
CAP_NET_BROADCAST,
|
||||||
|
CAP_NET_ADMIN,
|
||||||
|
CAP_NET_RAW,
|
||||||
|
CAP_IPC_LOCK,
|
||||||
|
CAP_IPC_OWNER,
|
||||||
|
CAP_SYS_MODULE,
|
||||||
|
CAP_SYS_RAWIO,
|
||||||
|
CAP_SYS_CHROOT,
|
||||||
|
CAP_SYS_PTRACE,
|
||||||
|
CAP_SYS_PACCT,
|
||||||
|
CAP_SYS_ADMIN,
|
||||||
|
CAP_SYS_BOOT,
|
||||||
|
CAP_SYS_NICE,
|
||||||
|
CAP_SYS_RESOURCE,
|
||||||
|
CAP_SYS_TIME,
|
||||||
|
CAP_SYS_TTY_CONFIG,
|
||||||
|
CAP_MKNOD,
|
||||||
|
CAP_LEASE,
|
||||||
|
CAP_AUDIT_WRITE,
|
||||||
|
CAP_AUDIT_CONTROL,
|
||||||
|
CAP_SETFCAP,
|
||||||
|
CAP_MAC_OVERRIDE,
|
||||||
|
CAP_MAC_ADMIN,
|
||||||
|
CAP_SYSLOG,
|
||||||
|
CAP_WAKE_ALARM,
|
||||||
|
CAP_BLOCK_SUSPEND,
|
||||||
|
CAP_AUDIT_READ,
|
||||||
|
}
|
||||||
|
}
|
145
vendor/github.com/syndtr/gocapability/capability/syscall_linux.go
generated
vendored
Normal file
145
vendor/github.com/syndtr/gocapability/capability/syscall_linux.go
generated
vendored
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
package capability
|
||||||
|
|
||||||
|
import (
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type capHeader struct {
|
||||||
|
version uint32
|
||||||
|
pid int
|
||||||
|
}
|
||||||
|
|
||||||
|
type capData struct {
|
||||||
|
effective uint32
|
||||||
|
permitted uint32
|
||||||
|
inheritable uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func capget(hdr *capHeader, data *capData) (err error) {
|
||||||
|
_, _, e1 := syscall.Syscall(syscall.SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = e1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func capset(hdr *capHeader, data *capData) (err error) {
|
||||||
|
_, _, e1 := syscall.Syscall(syscall.SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = e1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func prctl(option int, arg2, arg3, arg4, arg5 uintptr) (err error) {
|
||||||
|
_, _, e1 := syscall.Syscall6(syscall.SYS_PRCTL, uintptr(option), arg2, arg3, arg4, arg5, 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = e1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
vfsXattrName = "security.capability"
|
||||||
|
|
||||||
|
vfsCapVerMask = 0xff000000
|
||||||
|
vfsCapVer1 = 0x01000000
|
||||||
|
vfsCapVer2 = 0x02000000
|
||||||
|
|
||||||
|
vfsCapFlagMask = ^vfsCapVerMask
|
||||||
|
vfsCapFlageffective = 0x000001
|
||||||
|
|
||||||
|
vfscapDataSizeV1 = 4 * (1 + 2*1)
|
||||||
|
vfscapDataSizeV2 = 4 * (1 + 2*2)
|
||||||
|
)
|
||||||
|
|
||||||
|
type vfscapData struct {
|
||||||
|
magic uint32
|
||||||
|
data [2]struct {
|
||||||
|
permitted uint32
|
||||||
|
inheritable uint32
|
||||||
|
}
|
||||||
|
effective [2]uint32
|
||||||
|
version int8
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_vfsXattrName *byte
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
_vfsXattrName, _ = syscall.BytePtrFromString(vfsXattrName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getVfsCap(path string, dest *vfscapData) (err error) {
|
||||||
|
var _p0 *byte
|
||||||
|
_p0, err = syscall.BytePtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
r0, _, e1 := syscall.Syscall6(syscall.SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_vfsXattrName)), uintptr(unsafe.Pointer(dest)), vfscapDataSizeV2, 0, 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
if e1 == syscall.ENODATA {
|
||||||
|
dest.version = 2
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = e1
|
||||||
|
}
|
||||||
|
switch dest.magic & vfsCapVerMask {
|
||||||
|
case vfsCapVer1:
|
||||||
|
dest.version = 1
|
||||||
|
if r0 != vfscapDataSizeV1 {
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
dest.data[1].permitted = 0
|
||||||
|
dest.data[1].inheritable = 0
|
||||||
|
case vfsCapVer2:
|
||||||
|
dest.version = 2
|
||||||
|
if r0 != vfscapDataSizeV2 {
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
if dest.magic&vfsCapFlageffective != 0 {
|
||||||
|
dest.effective[0] = dest.data[0].permitted | dest.data[0].inheritable
|
||||||
|
dest.effective[1] = dest.data[1].permitted | dest.data[1].inheritable
|
||||||
|
} else {
|
||||||
|
dest.effective[0] = 0
|
||||||
|
dest.effective[1] = 0
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setVfsCap(path string, data *vfscapData) (err error) {
|
||||||
|
var _p0 *byte
|
||||||
|
_p0, err = syscall.BytePtrFromString(path)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var size uintptr
|
||||||
|
if data.version == 1 {
|
||||||
|
data.magic = vfsCapVer1
|
||||||
|
size = vfscapDataSizeV1
|
||||||
|
} else if data.version == 2 {
|
||||||
|
data.magic = vfsCapVer2
|
||||||
|
if data.effective[0] != 0 || data.effective[1] != 0 {
|
||||||
|
data.magic |= vfsCapFlageffective
|
||||||
|
}
|
||||||
|
size = vfscapDataSizeV2
|
||||||
|
} else {
|
||||||
|
return syscall.EINVAL
|
||||||
|
}
|
||||||
|
_, _, e1 := syscall.Syscall6(syscall.SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_vfsXattrName)), uintptr(unsafe.Pointer(data)), size, 0, 0)
|
||||||
|
if e1 != 0 {
|
||||||
|
err = e1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
Loading…
Reference in a new issue