Libseccomp: RFE: рдкрд╛рдЗрдереЙрди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдкрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдПрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 24 рджрд┐рд╕ре░ 2016  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: seccomp/libseccomp

enhancement prioritlow

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╕рдордп рдЗрд╕реЗ рдмреЗрд╣рдж рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдорд╛рдирддрд╛ рд╣реВрдВ (рдЬреЛ рд╣рдореЗрд╢рд╛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ)ред

рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬрд┐рдВрдЧ/рд╡рд┐рддрд░рдг рдХреЛрдб рдкрд░ рдкрд╛рдпрдерди рдкреНрд░рд▓реЗрдЦрди:

рдкреАрдЖрд░ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП

рдХреБрдЫ рддреНрд╡рд░рд┐рдд рд╕реБрдзрд╛рд░ MANIFEST.in рдХреЛ рдЬреЛрдбрд╝ рд░рд╣реЗ рдереЗ рдФрд░ setup.py рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд░рд╣реЗ рдереЗред рдореИрдВ pip install рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди setup.py рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╛рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ (рдореИрдВрдиреЗ рдЕрднреА рддрдХ # 217 рдХреА рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЬрд▓реНрдж рд╣реА )

рдЖрдИрдПрдордУ, рдмреЗрд╣рддрд░ рджреЗрд╡/рдкрд░реАрдХреНрд╖рдг/рд░рд┐рд▓реАрдЬ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд░реЗрдкреЛ рдореЗрдВ рдмрдирд╛рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╛рдпрдерди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдЗрдереЛрдирд╛рдЗрдЬреНрдб рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЬреЛ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрд╕рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИред

рдореИрдВ #61 рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ (рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХ рдирдП рд░реЗрдкреЛ рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, sphinx рдкрд╛рдпрдерди рдкреНрд░рд▓реЗрдЦрди рдЙрдкрдХрд░рдг рд╕рд╛рдЗрдерди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ)ред

рдЕрдВрдХ #216 рдореЗрдВ @pcmoore рдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ:

рд╣рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдореБрдЦреНрдп libseccomp рд╕реНрд░реЛрдд рд╡рд┐рддрд░рдг рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдо рдЧреЛрд▓рд╛рдВрдЧ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдореБрдЦреНрдп libseccomp рдкреИрдХреЗрдЬ рд╕реЗ рдкрд╛рдЗрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдореИрдВ рдпрд╣ рднреА рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдХрд╛рдо рд▓реЗрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╕реЗ рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ :)ред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдХ рдЕрд▓рдЧ рд░реЗрдкреЛ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕реНрд╡рдпрдВрд╕реЗрд╡рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред :^)

рдпрджрд┐ seccomp org рдХреЗ рддрд╣рдд рдПрдХ рдирдпрд╛ рд░реЗрдкреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓рд╛ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдкрд╛рдЗрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд░реЗрдкреЛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдкреАрдЖрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ:

  • рдкрд╛рдпрдерди рдиреЗрдЯрд┐рд╡ рдмрд┐рд▓реНрдб рдЯреВрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, setup.py build рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЛ setup.py рдореЗрдВ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп git рдЯреИрдЧреНрд╕ (setuptools-scm рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рд╕реЗ рдЙрдард╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рд╕реНрдереИрддрд┐рдХ рдмрдВрдзрди рдХреЗ рдмрдЬрд╛рдп рдореБрдЦреНрдп libseccomp рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдмрдВрдзрдиред (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА #217 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд)

рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рджреЛрд╣рди рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ pytest рдпрд╛ nose2 рд╢реИрд▓реА рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрд╢реА рдкрд╛рдпрдерди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЕрдВрдд рдореЗрдВ, рд╕реНрд░реЛрдд рдФрд░ рдмрд╛рдЗрдирд░реА рд╡рд┐рддрд░рдг рджреЛрдиреЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬред

рдореИрдВ рдЗрд╕реЗ v2.6 рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд░реНрде рд╣реИ "рдХреБрдЫ рд╕рдордп рдмрд╛рдж рд╣рдо v2.5 рджрд░рд╡рд╛рдЬреЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддреЗ рд╣реИрдВ"ред v2.5 рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЕрднреА рд╣рдорд╛рд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

libseccomp рдкрд╛рдЗрдк-рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рддреЛ рдореЗрдХ/рдкреЛрдПрдЯреНрд░реА/рдбреЙрдХрд░ (рдФрд░ рдкреИрдЪрд┐рдВрдЧ setup.py) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░рд╛ рд╢реМрдХрд┐рдпрд╛ рдХрд╛рдо рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдмрд┐рд▓реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рднреА рдЯреНрд╡реАрдХ/рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реВрдбреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

build-seccomp/setup.py (рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд /src/python/setup.py ):

# OLD IMPORTS
# -----------------------------------------
# import os 
# 
# from distutils.core import setup
# from distutils.extension import Extension
# from Cython.Distutils import build_ext
# -----------------------------------------

# Replace with these NEW IMPORTS
# -----------------------------------------
import os

from setuptools import setup, Extension
from Cython.Distutils import build_ext
# -----------------------------------------

# rest of the file unmodified...

рдореЗрдХрдлрд╝рд╛рдЗрд▓ :

.ONESHELL: install-libseccomp-native install-libseccomp-deps install-libseccomp build-whl-libseccomp

SECCOMP_BUILD_ENV = VERSION_RELEASE="0.0.0" \
                    CPPFLAGS="-I ../../include " \
                    CFLAGS="-Wall -g -O2" \
                    LDFLAGS="-Wl,-z -Wl,relro "
WHEEL_DIR = $(CURDIR)/dist

install-libseccomp-native:
ifeq (,$(wildcard libseccomp/.)) # If already cloned/built ignore
    git clone https://github.com/seccomp/libseccomp.git --branch v2.4.3 --depth 1
    cp build-seccomp/setup.py libseccomp/src/python/setup.py
    cd libseccomp
    ./autogen.sh
    ./configure --prefix=$(CURDIR)/libseccomp/build-aux
    make install
endif

install-deps:
    poetry install --no-root

# `make install-libseccomp` will install seccomp library into poetry virtual environment.
# this is a good option for local development
install-libseccomp: install-libseccomp-native install-deps
    cd libseccomp/src/python
    export $(SECCOMP_BUILD_ENV)
    poetry run python setup.py install

# `make build-whl-libseccomp` will create a .whl file for the seccomp library
# this is a good option for generating a build artifact in CI/CD or Docker
build-whl-libseccomp: install-libseccomp-native install-deps
    cd libseccomp/src/python
    export $(SECCOMP_BUILD_ENV)
    poetry run python setup.py bdist_wheel --dist-dir=$(WHEEL_DIR)

build-docker:
    docker build -t libseccomp-python .

run-docker:
    docker run --env SOME_VAR_1=42 --env SOME_VAR_2="Hello, World!" libseccomp-python

рдбреЙрдХрд░рдлрд╛рдЗрд▓ (рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рдордХрдХреНрд╖ рд▓реЗрдХрд┐рди рдмрджрд╕реВрд░рдд/рдЕрдзрд┐рдХ рдХреИрд╢ рдЕрдиреБрдХреВрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ):

# ============= BUILD STAGE ============= #
FROM python:3.8.3-buster as builder

# Install poetry
RUN pip install "poetry==1.0.5"

# Build/install wheels
WORKDIR /app
COPY pyproject.toml poetry.lock Makefile ./
COPY build-seccomp ./build-seccomp
RUN make build-whl-libseccomp

# ========== FINAL IMAGE STAGE ========== #
FROM python:3.8.3-slim-buster

# Install application
COPY --from=builder /app/dist /app/dist
WORKDIR /app
RUN pip install --no-index --find-links dist seccomp
COPY app ./app

# Configure
ENV SOME_VAR_1=
ENV SOME_VAR_2=

# Run the application
CMD ["python", "app/main.py"]

pyproject.toml :

[tool.poetry]
name = "libseccomp-demo"
version = "0.1.0"
description = "Building libseccomp for Python projects."
authors = ["Han Solo"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
cython = "^0.29.19"
wheel = "^0.34.2"

[build-system]
requires = ["poetry==1.0.5"]
build-backend = "poetry.masonry.api"

рдРрдк/main.py :

import os
import seccomp

print(os.environ['SOME_VAR_1'])
print(os.environ['SOME_VAR_2'])

рдореИрдВ рдЗрд╕ рдкрд░ рд╕рднреА рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╕ "рдзрдиреНрдпрд╡рд╛рдж" рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред @drakenclimber рдФрд░ рдореИрдВ рдЕрднреА рднреА v2.5.0 рд░рд┐рд▓реАрдЬ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╣рдо рдкрд░ рдЬреНрдпрд╛рджрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрд╕реЗ рд╡рд╛рджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓ рд░рд╣реЗ рд╣реИрдВ :)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jdstrand picture jdstrand  ┬╖  20рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

grubeli picture grubeli  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mvo5 picture mvo5  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

varqox picture varqox  ┬╖  23рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pcmoore picture pcmoore  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ