# پیکربندی Bind
در سرویس DNS داخلی (Bind) نیاز داریم که IP دامنهی www.digikala.com به 12.12.12.13 تغییر کند.
سرویس BIND بدین شکل پیکربندی شده است ( فایل ها را از لینک انتهای صفحه دریافت نمایید):
```
; named.conf
zone "." {
type hint;
file "/usr/share/dns/root.hints";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};
zone "digikala.com" {
type master;
file "/etc/bind/digikala.local";
};
options {
directory "/var/cache/bind";
forwarders {
8.8.8.8;
};
dnssec-validation auto;
listen-on-v6 { any; };
};
```
```
; digikala.local
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA digikala.com. root.digikala.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS digikala.com.
@ IN A 12.12.12.12
www IN A 12.12.12.13
```
## شرح مسئله
**توجه:** در فرمانهای زیر `127.0.0.1` DNS داخلی ست که در `docker-compose.yml` انتهای این سوال موجود است.
با پیکربندی بالا، دامنهی www.digikala.com به 12.12.12.13 Resolve می شود:
```
dig +short @127.0.0.1 www.digikala.com
12.12.12.13
```
اما بقیهی زیردامنههای دیجیکالا Resolve نمیشوند:
```
dig +short @127.0.0.1 mobile.digikala.com
```
راهی پیدا کنید که بقیهی زیردامنه های دیجیکالا از 8.8.8.8 Resolve بشوند ولی www.digikala.com از DNS داخلی به 12.12.12.13 Resolve بشود.
## نحوهی ارسال جواب
تغییرات خودتان را در محیط تست اعمال کنید و فایل zip شده ارسال نمایید. محتویات فایل zip شده می بایست به صورت زیر می باشد (فایل ها را از لینک انتهای صفحه دریافت نمایید):
```
├── configs
│ ├── db.0
│ ├── db.127
│ ├── db.255
│ ├── db.local
│ ├── digikala.local
│ ├── named.conf
│ └── root.hints
└── docker-compose.yml
```
#### دریافت فایل های محیط تست
فایل های مورد نیاز تست از طریق [این لینک](/contest/assignments/26287/download_problem_initial_project/87499/) قابل دسترس می باشد.
# اصلاح Helm Chart
برای دیپلوی سرویسی، Helm Chartی نوشته شده است که به واسطهی Image های تعریف شده در values.yml اقدام به اجرای Container های یک Pod می کند.
```
# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ .Release.Name }}-deployment"
labels:
app: "{{ .Release.Name }}"
spec:
replicas: 3
selector:
matchLabels:
app: "{{ .Release.Name }}"
template:
metadata:
labels:
app: "{{ .Release.Name }}"
spec:
containers:
{{ range $image := .Values.images }}
- name: "{{ .Release.Name }}-{{ $image }}"
image: "{{ $image }}"
{{ end }}
```
```
# values.yml
images:
- nginx
- php
```
## شرح مسئله
پس از اجرای `helm template`، خطای زیر رخ می دهد:
```
$ helm template -n test test ./ --debug
install.go:172: [debug] Original chart version: ""
install.go:189: [debug] CHART PATH: /home/salarmgh/Workspace/quera/helm/test
Error: template: test/templates/deployment.yaml:19:28: executing "test/templates/deployment.yaml" at <.Release.Name>: can't evaluate field Release in type interface {}
helm.go:81: [debug] template: test/templates/deployment.yaml:19:28: executing "test/templates/deployment.yaml" at <.Release.Name>:
can't evaluate field Release in type interface {}
```
با حل مشکل، Deploymentی با یک Pod که متشکل از ۲ کانتینر nginx و php می باشد، باید ساخته شود. بدیهی است که در صورت اضافه کردن image به values.yaml این تعداد افزایش پیدا می کند.
## نحوهی ارسال جواب
تغییرات خودتان را بر روی deployment.yaml در محیط تست اعمال کنید و فایل zip شده ارسال نمایید. محتویات فایل zip شده می بایست به صورت زیر می باشد (فایل ها را از لینک انتهای صفحه دریافت نمایید):
```
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ └── NOTES.txt
└── values.yaml
```
**نکته:** از ورژن ۳ Helm استفاده شود.
**نکته:** فقط deployment.yaml را تغییر بدهید.
#### دریافت فایل های محیط تست
فایل های مورد نیاز تست از طریق [این لینک](/contest/assignments/26287/download_problem_initial_project/87501/) قابل دسترس می باشد.
# تعریف کاربران در MySQL
## شرح مسئله
برای تعریف کاربران با سطوح دسترسی متفاوت Ansible Playbook بنویسید که بتوان در MySQL کاربران را با سطوح دسترسی متفاوت تعریف کرد.
کاربران بدین شکل در group_vars تعریف شده اند (این Playbook در لینک انتهای صفحه در دسترس است):
```
---
grants:
- name: john
host: "%"
password: qazwsx
grants:
- "testdb5.*:SELECT,INSERT,UPDATE,DELETE,CREATE"
- "testdb4.*:SELECT,INSERT,UPDATE,DELETE"
- "testdb3.*:SELECT,INSERT"
- "testdb2.*:SELECT"
- name: foo
host: "%"
password: 1234
grants:
- "testdb2.*:SELECT"
- "testdb3.*:UPDATE"
- name: bar
host: "172.16.16.%"
password: 1111
grants:
- "testdb2.*:SELECT"
- "testdb1.*:DELETE"
- "testdb4.*:SELECT,INSERT,UPDATE,DELETE"
- "testdb3.*:SELECT,INSERT"
- name: sara
host: "localhost"
password: 2222
grants:
- "testdb5.*:SELECT,INSERT,UPDATE,DELETE,CREATE"
- "testdb3.*:SELECT,INSERT"
- "testdb2.*:SELECT"
- "testdb4.*:SELECT,INSERT,UPDATE,DELETE"
```
پس از اجرای این Playbook انتظار داریم کاربران طبق این دسترسی ها در MySQL ایجاد شوند.
**نکته: در هنگام ارسال، اطلاعات اتصال به MySQL در تسک Ansible را حذف کنید.**
تغییرات خود را فقط در فایل `roles/grants/tasks/grants.yml` اعمال کنید.
نحوه ی اجرای تست:
```
ansible-playbook site.yml
```
## نحوهی ارسال جواب
تغییرات خودتان را در محیط تست در فایل `roles/grants/tasks/grants.yml` اعمال کنید و سپس فایل های خود را به صورت zip شده با ساختار زیر ارسال نمایید.( فایل ها را از لینک انتهای صفحه دریافت نمایید)
```
├── docker-compose.yml
├── group_vars
│ └── all
│ ├── main.yml
│ └── mysql.yml
├── inventory
│ └── sample
│ └── hosts.yml
├── roles
│ └── grants
│ ├── handlers
│ ├── tasks
│ │ ├── main.yml
│ │ └── grants.yml
│ └── templates
└── site.yml
```
#### دریافت فایل های محیط تست
فایل های مورد نیاز تست از طریق [این لینک](/contest/assignments/26287/download_problem_initial_project/87500/) قابل دسترس می باشد.
# راهنما
اسکریپتها **باید** ورودی را از فایل داده شده بخوانند بدین شکل:
```
$ ./script.sh input.txt
```
اسکریپتها **باید** خروجی را در stdout چاپ کنند.
اسکریپتها **باید** خروجی خود را مطابق با فرمت داده شده چاپ کنند.
# بررسی سلامت سرورها
فایلی شامل چهار ستون از اعداد داده شده است. ستون اول شامل یک حرف انگلیسی است که شناسه هر سرور محسوب می شود. سه ستون دیگر هر کدام شامل شاخصهای مربوط به سرورها هستند که به ترتیب، شاخص استفاده سی پی یو، رم و شبکه است. هر شاخص در بازه ی بستهی ۰ تا ۱۰۰ قرار دارد.
اسکریپتی بنویسید که تشخصی دهید آیا سرورها سلامت هستند یا نه. مبنای سلامتی هر سرور این است که هر شاخص **بزرگتر یا مساوی** ۵۰ باشد.
### نمونه ورودی
```
$ cat server_input.txt
A 29 23 50
B 33 39 75
C 79 85 80
D 99 88 69
```
### نمونه خروجی
```
$ server_status.sh server_input.txt
A: Fail
B: Fail
C: Pass
D: Pass
```
# شمارش اسامی
اسکریپتی بنویسید که بتواند تعداد اسامی افراد را از متن زیر استخراج کند. دقت کنید اسمها با یک سری جداکننده از هم جدا شدهاند که جداکنندهها به شرح زیر هستند:
* Tab
* Space (Blank)
* Comma `,`
* Bar `|`
* Exclamation Mark `!`
* Dollar Sign `$`
* New Line
* Backslash `\`
### نمونه ورودی
```
$ cat server_input.txt
ali behnam salar,javad|ehsan\mohammad!hossein
hadi
ali
mohammadreza
```
### نمونه خروجی
```
$ count_names.sh names_input.txt
Count: 10
```
## نحوهی ارسال جواب
تغییرات خودتان را در محیط تست اعمال کنید و سپس فایل های خود را به صورت zip شده با ساختار زیر ارسال نمایید. (فایل ها را از لینک انتهای صفحه دریافت نمایید).
```
.
├── count_names.sh
├── names_input.txt
├── server_input.txt
└── server_status.sh
```
#### دریافت فایل های محیط تست
فایل های مورد نیاز تست از طریق [این لینک](/contest/assignments/26287/download_problem_initial_project/87502/) قابل دسترسی می باشد.
# پیکربندی HA Proxy
اپلیکیشنی داریم با دو Endpoint:
| Endpoint | Status Code |
|-------------|-------------|
|/working | 200 |
|/not-working | 500 |
اپلیکیشن در حالت Debug Mode اجرا شده است و در صورت وجود خطا Stack Trace کد را نمایش میدهد.
در جلوی اپلیکیشن HA Proxy داریم که به عنوان Reverse Proxy و Load Balancer عمل می کند.
## شرح مسئله
نیاز داریم در صورتی که اپلیکیشن خطایی داشت به کاربر صفحه ی 403 نشان بدهیم، اما به برنامه نویسان و DevOps صفحه ی Stack Trace را نشان بدهیم که بتوانند مشکل را پیدا و حل بکند. برنامه نویسان و DevOps یک Header مخصوص برای این کار دارند.
| Header | Value |
|----------|----------------------|
|staff | f34ac726dd7486a22bc0 |
در صورت وجود این Header در ریکوئست باید به کاربر Stack Trace به صورت کامل نمایش داده شود.
**- شرایط تست**
تنظیمات HA Proxy به شرح زیر می باشد( فایل ها را از لینک انتهای صفحه دریافت نمایید):
```
# haproxy.cfg
global
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /usr/local/etc/haproxy/errors/400.http
errorfile 403 /usr/local/etc/haproxy/errors/403.http
errorfile 408 /usr/local/etc/haproxy/errors/408.http
errorfile 500 /usr/local/etc/haproxy/errors/500.http
errorfile 502 /usr/local/etc/haproxy/errors/502.http
errorfile 503 /usr/local/etc/haproxy/errors/503.http
errorfile 504 /usr/local/etc/haproxy/errors/504.http
frontend http
bind *:8888
use_backend app
backend app
server app1 api:5000
```
*نکته: برای نمایش 403 از errorfile 403 در HA Proxy استفاده شود*
دستور مربوط به انجام تست:
```
$ curl localhost:8888/working
It works
```
```
$ curl localhost:8888/not-working
<html><body><h1>403
Forbidden</h1>
Request
forbidden by administrative rules.
</body></html>
```
```
$ curl localhost:8888/not-working -H "staff: f34ac726dd7486a22bc0"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Exception: test // Werkzeug Debugger</title>
<link rel="stylesheet" href="?__debugger__=yes&cmd=resource&f=style.css"
type="text/css">
<!-- We need to make sure this has a favicon so that the debugger does
not by accident trigger a request to /favicon.ico which might
change the application state. -->
<link rel="shortcut icon"
href="?__debugger__=yes&cmd=resource&f=console.png">
<script src="?__debugger__=yes&cmd=resource&f=jquery.js"></script>
<script src="?__debugger__=yes&cmd=resource&f=debugger.js"></script>
.
.
.
```
**نکته:** ورژن HA Proxy 2.3.4 مورد استفاده است
## نحوه ی ارسال جواب
تغییرات خودتان را در محیط تست اعمال کنید و سپس فایل های خود را به صورت zip شده با ساختار زیر ارسال نمایید.( فایل ها را از لینک انتهای صفحه دریافت نمایید)
```
├── api
│ ├── api.py
│ ├── Dockerfile
│ └── requirements.txt
├── docker-compose.yml
├── haproxy
│ ├── errors
│ │ ├── 400.http
│ │ ├── 403.http
│ │ ├── 408.http
│ │ ├── 500.http
│ │ ├── 502.http
│ │ ├── 503.http
│ │ └── 504.http
│ └── haproxy.cfg
```
**نکته: هنگام ارسال در فایل haproxy.cfg بخش backend سرور را تغییر ندهید**
```
server app1 api:5000
```
## دریافت فایل های محیط تست
فایل های مورد نیاز تست از طریق [این لینک](/contest/assignments/26287/download_problem_initial_project/87498/) قابل دسترسی می باشد.