Привет, по случаю прикрутил к kui'ю немного helm'а. Можно посмотреть статус, историю, манифест и откатить релиз.

Творите, выдумывайте, пробуйте!)

Код, за который должно быть стыдно
Привет, как узнать % использования PVC? Kui поможет! Добавил команду PVC Usage

PVC это абстракция поэтому прямого пути (команды) узнать использование PVC нет. Как сделано? Ищем стручек (pod) который использует искомый PVC:
pvc_used_in=$(
kubectl -n $namespace get po -o \
jsonpath='{range .items[*]}{.metadata.name}{" "}{range .spec.volumes[*]}{.name}{" "}{.persistentVolumeClaim.claimName}{" \n"}{end}{end}' | \
grep " $pvc_name "
)
raw=($pvc_used_in)
pod_name=${raw[0]}
mnt_name=${raw[1]}Находим точку g монтирования:
pod_mount_name=$(
kubectl -n $namespace get po/$pod_name -o \
jsonpath='{range .spec.containers[*]}{range .volumeMounts[*]}{.name}{" "}{.mountPath}{"\n"}{end}{end}' | \
awk "/$mnt_name /"'{print $2}'
)Проверяем использование диска (PVC):
pvc_usage=$(
kubectl -n $namespace exec po/$pod_name -- df -h $pod_mount_name
)Выводим результат:
echo "PVC capacity: $pvc_capacity"
echo "PVC used in:"; echo "$pvc_used_in"
echo "PVC usage:" ; echo "$pvc_usage"
PVC capacity: 750Gi
PVC used in:
kafka-dev-broker-1 data data-kafka-dev-broker-1
PVC usage:
Filesystem Size Used Avail Use% Mounted on
/dev/rbd4 738G 44G 695G 6% /bitnami/kafkaБонусом добавил возможность прибивать PVCишки kui'ем, добавил команды Delete и Terminate.
Творите, выдумывайте, пробуйте!)
Эгегей! Радость, kui снова подрос! Добавлена команда 'SSL update' для обновления сертификатов и ключей в секретах типа 'kubernetes.io/tls'. Как это работает?
Кладете в какую-нибудь папку новый сертификай, файл должен называться tls.crt и ключ с именем tls.key
Запускаете kui в этой папке, находите секрет с сертификатом который необходимо обновить
Обновляете через 'SSL update'

Под капотом, обновление выполняется вот такой командой:
printf -v ssl_patch_data '{"data": {"tls.crt": "%s", "tls.key": "%s"}}' "$(base64 -w0 tls.crt)" "$(base64 -w0 tls.key)"
kubectl patch secret/<secret_name> -n <namespace> --patch="$ssl_patch_data"Творите, выдумывайте, пробуйте!)
Привет, смотрите че наговнокодил, вот такую вот проверку конфига для haproxy
if check '/etc/haproxy/haproxy.cfg'; then
red='\e[91m'
ylw='\e[93m'
DEF='\e[0m'
/usr/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg || printf "
${red}WARNING!
${red}Haproxy config has errors!
${ylw} __
${ylw}| \_____${red}︹${DEF}
${ylw}\ ${red}\ \ ${DEF}
${ylw}/ ______${red}/ / ${DEF}
${ylw}|__/ ${red}︺ ${DEF}
"
fiВыглядит вот так:

Как вам?)
Творите, выдумывайте, пробуйте!)
Как немножко хакнуть Мосрег
Всем привет!
При оформлении заявлений в детский сад на детей на uslugi.mosreg.ru столкнулся с тем, что если ранее было подано заявление и нужно какие-то данные в нём поправить, то выбрать год зачисления ребёнка в ДС можно только следующий. То есть, мы подали в 2024, а теперь можно выбрать только 2026 год, потому что текущий нельзя.
Мне показалось это не очень удобным, решил немножко изучить фронтенд сайта и обнаружил, что валидации на простановку года нет :)
В видео подробнее, как обойти ограничение
P.S. На записи не видно контекстного меню в браузере, когда нажимаешь ПКМ, нас интересует последний пункт "Просмотреть код"
Я устал от форматирования JSON файлов

Я много и часто просматриваю JSON-файлы: от конфигураций сервисов до API ответов и логов. Каждый раз, открывая очередной файл, я форматирую содержимое, чтобы было удобнее читать (ведь JSON не только machine-readable, но и human-readable). И каждый раз я грущу, что все сервисы (онлайн, встроенные средства IDE и даже плагины) предоставляют лишь две крайности: форматировать всё или ничего (минифицировать в одну строку).
Но что, если я хочу отформатировать JSON лишь до определённого уровня? Что, если у меня есть огромный список словарей (возможно, даже глубоких), который при форматировании выглядит как-то так:
[
{
"id": 1,
"name": "Alice",
"birthday": {
"day": 5,
"month": 4,
"year": 1983
}
},
{
"id": 2,
"name": "Bob",
"birthday": {
"day": 6,
"month": 2,
"year": 1945
}
},
{
"id": 3,
"name": "Eve",
"birthday": {
"day": 10,
"month": 11,
"year": 1978
}
}
]Что, если я хочу оставить каждый словарь в более компактном (не совсем минифицированном) виде? Например, таком:
[
{"id": 1, "name": "Alice", "birthday": {"day": 5, "month": 4, "year": 1983}},
{"id": 2, "name": "Bob", "birthday": {"day": 6, "month": 2, "year": 1945}},
{"id": 3, "name": "Eve", "birthday": {"day": 10, "month": 11, "year": 1978}}
]Или я хочу, чтобы в каждом словаре развёрнуты были только внешние ключи?
[
{
"id": 1,
"name": "Alice",
"birthday": {"day": 5, "month": 4, "year": 1983}
},
{
"id": 2,
"name": "Bob",
"birthday": {"day": 6, "month": 2, "year": 1945}
},
{
"id": 3,
"name": "Eve",
"birthday": {"day": 10, "month": 11, "year": 1978}
}
]Да, многие текстовые редакторы вроде Sublime Text или VS Code дают возможность свернуть контент до определённого уровня. Но что, если я хочу оставить файл в этом промежуточном виде и просматривать его прямо в терминале, подключившись по ssh? Или я хочу посмотреть файл на гитхабе с телефона? Да, возможно, мои вкусы весьма специфичны, но в существующих реалиях я вынужден грустно довольствоваться лишь полностью развёрнутым вариантом (или делать это вручную). Встроенные средства форматирования JSON в JS или Python также не предоставляют простой возможности ограничить глубину (либо я так и не научился их готовить).
Поэтому я собрался с силами и написал свой форматтер с возможностью ограничить глубину. Помимо базового функционала вроде валидации, минификации и настройки количества отступов, в нём есть настройка максимальной глубины (по умолчанию она равна нулю, что соответствует привычному форматированию без ограничений).
Да, он вряд ли подойдёт, чтобы редактировать на лету гигантские JSON файлы. И он уж точно не пытается стать убийцей какого-либо из существующих онлайн сервисов. В первую очередь он призван решить мою проблему: сделать форматирование JSON чуточку более управляемым. А если и вы сталкивались с подобной проблемой, буду рад, если сервис поможет и вам!
Привет, развил тему пропихивания стручков (pod'ов) в кубернетис, добавил в меню выбора типа объектов команду apply. Теперь kui'ем можно приколачивать мYAMLики, создавая любые типы объектов. По умолчанию предлагает создать стручок:

Но с помощью кнопки edit можно изменить мямлик, изменения сохранятся в файл ~/.kyml.
С удивлением обнаружил что хаб Кодобред переименован в Говнокод О_о Чтож, так даже интереснее.
Творите, выдумывайте, пробуйте!)
Привет, приспичило создать тестовый стручек (pod), проверить кое-что. Создал и добавил это в kui, в секцию "быстрых" команд:

Тестовый стручек создается вот такой командой:
kube run $quick_pod_name $ns --image=$quick_pod_image --command -- $quick_pod_command 2>&1Для изменения названия, образа или команды стручка подредактируйте вот эти переменные в начале скрипта:
quick_pod_name=busytest # Pod name for simple test pod
quick_pod_image=busybox:1.32 # Pod image for simple test pod
quick_pod_command="sleep 3600" # Pod command for simple test podТворите, выдумывайте, пробуйте!)
Привет, зачастую после тыкания в какой-нибудь стручок (pod) приходится подниматься на уровень выше в деплой, стейтфулсет или даемонсет. Для этого в kui надо было сначала посмотреть чем контролируется стручок, сделав describe, потом сменить тип объекта, найти нужный... Хватить теребонькать эти стручки! Добавил для стручков команду Controlled by, она сразу тыкает kui в нужное место!

Творите, выдумывайте, пробуйте!)
Привет, долгожданные новости из мира кубернетиса. Иногда надо посмотреть за подиками, как они там живут поживают, все ли (ре)стартанули или кто завис. В kui для этого сделана кнопка RELOAD. Но постоянно жмякать кнопку это же дро...во какое-то правда? Хватит это терпеть! Добавил команду watch it, теперь можно залипнуть на какое-то время, глядя как подики ползают туда-сюда.

Оно будет с паузой в 3 секунды (+ время на обновление) постоянно показывать вывод kubectl get ...
NAME READY STATUS RESTARTS AGE
chi-cluster-dev01-0-0-0 2/2 Running 0 23d
chi-cluster-dev01-0-1-0 2/2 Running 0 23d
chi-cluster-dev01-0-2-0 2/2 Running 0 23d
Press x to stop watching this...Нажмите x когда надоест.
Творите, выдумывайте, пробуйте!)
Бинго разработчика: ставь лайк зачеркивай, если было
В выходные не работаем, но развлекаемся, поэтому предлагаем вам сыграть в бинго разработчика! Правила — простые:
сохраняйте/делайте скрин картинки из поста;
отмечайте клеточки с вашей разработческой жизой;
скидывайте в комментарии итог. Или можете просто писать в комментах то, что хотели бы зачеркнуть в этом бинго, ваши варианты особенно приветствуются)

Ждем того, кто соберет все ачивки!
А как закончите с бинго — в нашем TG‑канале есть еще одна занимательная игра с кубиком и картами инженерного таро, которые предскажут ваше будущее! Переходите по ссылке и развлекайтесь, на канал тоже подписывайтесь, там часто бывает всякое интересное.
Привет, все знают(?) что данные в скрипт можно передать через аргументы, как-то так:
$ cat test
#!/bin/bash
var=$1
echo $var
$ ./test bla
blaНо в какой-то момент аргументов становится слишком много, а так чешется всунуть что-то еще)
Куда всунуть? Как? В каком порядке? Сначала сунуть это, потом то? Городить гетопс?
В этом случае бывает удобно использовать переменные окружения!
$ cat test
#!/bin/bash
var1=$1
var2=$2
var3=$3
var4=$4
var5=$5
echo $var1 $var2 $var3 $var4 $var5 $one_more_var
$ one_more_var=ble ./test
bleТворите, выдумывайте, пробуйте!)
Привет, иногда хочется утащить из скрипта переменные или функции. Это можно легко сделать используя source. Но есть заковыка. Скрипт-источник будет выполнен, что не всегда удобно. Пример:
$ cat test
#!/bin/bash
var1=bim
var2=bom
echo you should not see this $var1 $var2Пробуем засорсить:
$ var1= var2=; . ./test; echo $var1 $var2
you should not see this bim bom
bim bomМы получили вожделенные переменные но при этом выполнился нежелательный код. Как этого избежать? Можно немного модифицировать скрипт:
$ cat test
#!/bin/bash
var1=bim
var2=bom
[[ $1 == only_vars ]] && return
echo you should not see this $var1 $var2Теперь если сорсить скрипт с параметром only_vars, нежелательный код будет опущен, пробуем:
$ var1= var2=; . ./test only_vars; echo $var1 $var2
bim bomВажно использовать именно return, exit закроет текущую оболочку.
Творите, выдумывайте, пробуйте!)