Sandboxed API के साथ शुरू करना

इस पेज पर, आपको Sandboxed API (SAPI) की मदद से, सैंडबॉक्स की गई C/C++ लाइब्रेरी बनाने का तरीका बताया जाएगा. हेडर फ़ाइलों में दिए गए कोड दस्तावेज़ और उदाहरणों के साथ, इसे गाइड के तौर पर इस्तेमाल करें.

डिपेंडेंसी बनाएं

सिस्टम पर ये डिपेंडेंसी इंस्टॉल करनी होंगी:

  • UTS, IPC, उपयोगकर्ता, PID, और नेटवर्क नेमस्पेस के साथ काम करने वाला Linux kernel
  • Linux यूज़रस्पेस एपीआई हेडर
  • अपना कोड कंपाइल करने के लिए: GCC 6 (पसंदीदा वर्शन 7 या उसके बाद का वर्शन) या Clang 7 (या उसके बाद का वर्शन)
  • अपने-आप जनरेट होने वाली हेडर फ़ाइलों के लिए: Clang Python Bindings
  • Python 3.5 या इसके बाद का वर्शन
  • Bazel का 2.2.0 या CMake वर्शन 3.12 या इसके बाद का वर्शन.
    • सिर्फ़ CMake: GNU Make या libcap लाइब्रेरी के हेडर का वर्शन और एक बिल्ड टूल जैसे कि Ninja (सुझाया गया).

Bazel का इस्तेमाल करना

Bazel एक बिल्ड सिस्टम है. इसे आसानी से इंटिग्रेट किया जा सकता है.

हमारे दस्तावेज़, Clang कंपाइलर का इस्तेमाल करते हैं. अगर आपको किसी खास टूलचेन की ज़रूरत है (जैसे, कंपाइलर, लिंकर वगैरह), तो डिफ़ॉल्ट कंपाइलर टूलचेन को बदलने के तरीके के बारे में जानने के लिए, Bazel दस्तावेज़ देखें.

Debian 10 (बस्टर)

बिल्ड डिपेंडेंसी इंस्टॉल करने के लिए:

echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | \
  sudo tee /etc/apt/sources.list.d/bazel.list
wget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -qy build-essential linux-libc-dev bazel python3 \
  python3-pip libclang-dev
pip3 install clang

जेंटू

Kernel विकल्प ज़रूरी हैं:

General setup  --->
-*- Namespaces support
[*]   UTS namespace
[*]   IPC namespace
[*]   User namespace (EXPERIMENTAL)
[*]   PID Namespaces
[*]   Network namespace

बिल्ड डिपेंडेंसी इंस्टॉल करने के लिए:

emerge dev-util/bazel dev-python/typing dev-python/clang-python

CMake का इस्तेमाल करना

CMake एक लोकप्रिय ओपन सोर्स मेटा बिल्ड सिस्टम है, जो Ninja या Make जैसे बिल्ड टूल के लिए प्रोजेक्ट फ़ाइलें जनरेट करता है.

Debian 10 (बस्टर)

बिल्ड डिपेंडेंसी इंस्टॉल करने के लिए:

sudo apt-get install -qy build-essential linux-libc-dev cmake ninja-build \
  python3 python3-pip libclang-dev libcap-dev
pip3 install absl-py clang

जेंटू

Kernel विकल्प ज़रूरी हैं:

General setup  --->
-*- Namespaces support
[*]   UTS namespace
[*]   IPC namespace
[*]   User namespace (EXPERIMENTAL)
[*]   PID Namespaces
[*]   Network namespace

बिल्ड डिपेंडेंसी इंस्टॉल करने के लिए:

emerge sys-kernel/linux-headers dev-util/cmake dev-util/ninja \
dev-python/clang-python

डेवलपमेंट प्रोसेस

C/C++ लाइब्रेरी को सैंडबॉक्स करने के लिए, आपको अपने प्रोजेक्ट के लिए दो आइटम तैयार करने होंगे:

Sandbox2 के उदाहरणों में से zlib के बारे में आपको पता होगा. यहां एक पूरा प्रोग्राम (zpipe.c) को सैंडबॉक्स किया गया था. नीचे दिए गए चरणों में, zlib को सैंडबॉक्स करने के लिए SAPI का इस्तेमाल करने और सैंडबॉक्स की गई लाइब्रेरी का इस्तेमाल करने का तरीका बताया गया है.

1. तय करें कि किन फ़ंक्शन की ज़रूरत है

zlib होस्ट कोड (main_zlib.cc) देखने पर, आपको पता चलेगा कि इस टूल को stdan का डेटा पढ़ना है और zlib के deflate() फ़ंक्शन का इस्तेमाल करके, डेटा को तब तक कंप्रेस करना है, जब तक EOF मार्कर पढ़ा नहीं जाता. कुल मिलाकर, यह प्रोग्राम zlib के तीन फ़ंक्शन का इस्तेमाल करता है:

  • deflateInit_(): कंप्रेस करने के लिए शुरू करने के लिए
  • deflate(): डेटा हिस्से पर कंप्रेस करने की कार्रवाई करने के लिए
  • deflateEnd(): कंप्रेस की गई फ़ाइलों और डाइनैमिक रूप से असाइन किए गए बिना किसी डेटा स्ट्रक्चर के इस्तेमाल को खत्म करने के लिए

असल ज़िंदगी के उदाहरण में आप C/C++ लाइब्रेरी की समीक्षा करेंगे और तय करेंगे कि किन फ़ंक्शन की ज़रूरत है. संभावित रणनीति यह है कि होस्ट कोड से शुरुआत की जाए और सैंडबॉक्स न की गई लाइब्रेरी का इस्तेमाल किया जाए. इसके बाद, दूसरे चरण में, सैंडबॉक्स की गई लाइब्रेरी जनरेट की जा सकती है. साथ ही, सैंडबॉक्स किए गए फ़ंक्शन कॉल का इस्तेमाल करने के लिए, होस्ट कोड को ऑप्टिमाइज़ किया जा सकता है.

2. sapi_library बनाने का नियम लिखें

सैंडबॉक्स की गई zlib लाइब्रेरी के लिए ज़रूरी तीन zlib फ़ंक्शन की पहचान करने के बाद, आप BUILD फ़ाइल में बिल्ड नियम तय कर सकते हैं. sapi_library बिल्ड नियम का दस्तावेज़ बनाने के नियम पेज पर देखा जा सकता है.

नीचे दिया गया कोड स्निपेट, zlib SAPI उदाहरण के लिए sapi_library की परिभाषा दिखाता है. lib एट्रिब्यूट का इस्तेमाल करके, Bazel को zlib लाइब्रेरी के लिए Workspace फ़ाइल देखने का निर्देश दिया जाता है.

sapi_library(
    name = "zlib-sapi",
    srcs = [],
    hdrs = [],
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@net_zlib//:zlib",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)

इसका नतीजा यह होता है कि सैंडबॉक्स की गई zlib लाइब्रेरी जनरेट हो जाती है. आउटपुट एक SAPI ऑब्जेक्ट है, जिसे होस्ट कोड में शामिल किया जा सकता है. इसका इस्तेमाल RPC कॉल की मदद से, सैंडबॉक्स की गई लाइब्रेरी से संपर्क करने के लिए किया जा सकता है. इस उदाहरण में इस्तेमाल की गई सैंडबॉक्स नीति, डिफ़ॉल्ट नीति है.

3. होस्ट कोड लिखना या बदलना

अब जनरेट की गई SAPI लाइब्रेरी को होस्ट कोड में शामिल करने का समय आ गया है.

सैंडबॉक्स बनाएं

कोई सैंडबॉक्स ऑब्जेक्ट बनाने के लिए sapi::Sandbox sandbox(sapi::zlib::zlib_sapi_embed_create()); का इस्तेमाल करें.

SAPI ऑब्जेक्ट को इंस्टैंशिएट करने के लिए sapi::zlib::ZlibApi api(&sandbox); का इस्तेमाल करें. इससे सैंडबॉक्स किए गए फ़ंक्शन को इस्तेमाल के लिए उपलब्ध कराया जा सकेगा.

SAPI टाइप का इस्तेमाल करें

SAPI टाइप, C++ क्लास के रूप में खास टाइप हैं. इन्हें SAPI उपलब्ध कराता है, क्योंकि कभी-कभी सामान्य सी-टाइप काम नहीं करते.

SAPI टाइप के पहली बार इस्तेमाल को strm के एलान में देखा जा सकता है, जहां SAPI Struct का इस्तेमाल किया जाता है: sapi::v::Struct<sapi::zlib::z_stream> strm;

टेंप्लेट टाइप (sapi::zlib::z_stream), बिल्ड के नियम से अपने-आप जनरेट होने वाले कोड का एक अच्छा उदाहरण है.

ज़्यादा जानकारी के लिए, वैरिएबल पेज पर जाएं.

एपीआई कॉल करें

defalteInit_, deflate या deflateEnd में से किसी एक को कॉल करने के लिए, SAPI ऑब्जेक्ट का इस्तेमाल करें. अगर आपने 'बदलाव' अप्रोच का इस्तेमाल करने का फ़ैसला किया है, तो आपको यह पक्का करना होगा कि फ़ंक्शन पैरामीटर सही वैल्यू से मेल खाते हों.

zlib के उदाहरण में दिए गए हर कॉल का उदाहरण:

  • api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION,
        version.PtrBefore(), sizeof(sapi::zlib::z_stream));
  • api.deflate(strm.PtrBoth(), flush);
  • api.deflateEnd(strm.PtrBoth()).IgnoreError();

SAPI लेन-देन का इस्तेमाल करना

SAPI, सैंडबॉक्स की गई लाइब्रेरी से होस्ट कोड को अलग करता है और कॉलर को समस्या वाले डेटा प्रोसेसिंग अनुरोधों को रीस्टार्ट या रद्द करने की सुविधा देता है. SAPI लेन-देन एक और कदम आगे बढ़कर, असफल प्रक्रियाओं को अपने-आप दोहराता है.

ज़्यादा जानकारी के लिए, SAPI लेन-देन पेज पर जाएं.

उदाहरण

उदाहरण में, आपको ऐसी कुछ लाइब्रेरी मिल सकती हैं जिन्हें SAPI टीम पहले ही तैयार कर चुकी है.