LINUX.ORG.RU

Сообщения conformist

 

Browse repo with self-hosted engine

Привет.

Чтобы избежать xy-problem опишу какую проблему я хочу решить.

Есть пачка приватных репо, которые иногда хочется просматривать. Разумеется не сильно хочется делать это через файловую систему, просто неудобно. Так же не хочется добавлять все репы как проекты в IDE и потом переключаться.

Цель получить self-hosted интерфейс типа гитхаба, чтобы там список репо и можно по ним клацать там, смотреть что нужно.

Вариант решения — self hosted gitea. Добавил её в список уже подобных решений через traefik, всё работает, что я хотел в этом сетапе:

настроить синк файлов с рабочей машины на малинку и чтобы всегда это можно было просматривать через браузер с помощью gitea.

Проблема, с которой столкнулся — формат репо у хоста иной, нежели просто репо, который клонируется (информация о ветках, ревизиях разных).

Как сконвертировать репо (пусть даже одну какую-то ветку) в репо для gitea, чтобы последовательно можно было копировать из настоящего с помощью rsync, чтобы обновлять текущий статус?

 , ,

conformist
()

Альтернатива Makefile для создания алиасов длинных комманд

В общем сабж, обычно для выполнения длинных комманд создаётся Makefile, который помогает писать меньше букв. Например:

build:
    docker compose build

и после просто пишем:

make build

и так далее. Конкретно с docker compose (который v2) это приводит к неприятным проблемам: отсутствие цветов, а так же буфферизация мешает обновлять терминал. Так же мешает запускать createsuperuser для django, сразу падает ошибка, что мол не интерактивно, а без make работает нормально.

Собственно ищу путь, как бы достичь сокращения команд, но чтобы это было в рамках проекта (т.е. алиасы в .bashrc или что-то подобное не совсем подходит).

Может есть какой-то инструмент, которым бы это было легко достичь?

 ,

conformist
()

Share local network through mikrotik openvpn client

Всем привет. Есть такая потребность: расшарить локальную сетку при подключении к vpn сети. Это нужно, чтобы извне иметь доступ к камерам наблюдения дома.

Что есть:

  • дроплет на DO с двумя openvpn серверами (один настроен давно и имеет несколько клиентов, потому конфиг менять не хочется, пусть подключение будет по tls, а второй специально для микрота, на нём авторизация по login/pass)
  • собственно микрот с настроенным соединением как клиент к openvpn-server-2

Оба vpn сервера настроены с такими подсетями:

  • openvpn-server-1: 10.10.10.0 255.255.255.128
  • openvpn-server-2: 10.10.10.128 255.255.255.128

Адрес микротика статический: 10.10.10.129

подключаясь с телефона, например, к vpn, могу пинговать оба сервера.

Последний этап — добавить маршруты так, чтобы любой клиент мог пинговать/подключаться к адресам внутри локальной сети 192.168.88.0/24.

Опция client-to-client добавлена, клиенты пинговать друг друга могут.

 , ,

conformist
()

Использование библиотеки, требующей `window` в nodejs

В общем сабж. Есть желание написать обёртку над либой, но она для браузера и падает с ошибкой, когда внутри идёт обращение к объекту window.

Можно ли как-то это обойти?

 ,

conformist
()

Conditional lookahead regex in python

Допустим есть такая регулярка на PHP:

^\+61(?(?=1800)1800\d{6}|\d{9})$

на странице видно, что из 4-х номеров она матчит только первые 2

+611800123456  # match
+61123456789   # match

+61180012345
+6112345678

В python такой синтаксис не поддерживается, указано, что группа должна быть именованная, чтобы на неё сослаться, т.е. как-то так, как я понимаю:

^\+61(?P<test>1800)?(?(test)\d{6}|\d{9})$

но проблема в том, что в этом варианте матчится и третий номер, хотя не должен.

Собственно вопрос, как исправить?

 ,

conformist
()

Using docker-compose inside a running network

Привет.

Есть сеть, созданная с помощью docker-compose, которая работает (приложение, база данных, что-то ещё).

Я хочу что-то сделать с базой данных с помощью моего кастомного скрипта, который так же собран с помощью Dockerfile. Чтобы это сделать, я хочу написать другой docker-compose так, что он будет зависеть от базы данных, запущенной ранее (например при запуске передать какие-то параметры с помощью переменных окружения). Или как-то расшарить сеть, чтобы достучаться до БД.

Дело в том, что делая proxynetwork я не могу подключиться к БД, созданной в другом docker-compose.

Ищу совет, ссылку на документацию, что угодно, чтобы такое реализовать.

 ,

conformist
()

Запретить повторное отправление формы

Есть простая форма:

<form method="get">
  <input type="text" name="email">
</form>

Так исторически сложилось в html, что при нажатии на Enter — она отправляется. Проблема в том, что Enter можно нажать много раз и хотелось бы после первого нажатия заблокировать возможность повторной отправки.

Если сделать:

<form onsubmit="email.disabled=true;">...</form>

то форма игнорирует disabled поля и она приходит пустой.

Форма inline, добавить кнопку, конечно, можно, но хотелось бы избежать этого, чтобы не изменять привычный пользователям интерфейс.

 , ,

conformist
()

Database level constraint

Всем привет.

Есть в БД такое понятие, как ограничения. Например есть ограничение unique_together, когда нельзя иметь в БД 2 записи с одинаковыми парами полей. Но это ограничение не всегда работает в django. Т.е. запросто с этим ограничением можно создать объекты в базе методом model.save или через queryset: Model.objects.create — чтобы этого избежать, нужно вызвать метод full_clean или validate_unique.

Это всё методы из django ORM. А есть ли какой-то способ запретить на уровне базы данных? Т.е. создать такое ограничение, которое просто не позволит сделать insert, вызвав ошибку?

 , , , ,

conformist
()

Vue.js как добавление реактивности

Привет.

Решил я сделать свой мини сайт на vps для лично своих заметок и прочих нужд. Т.к. в основном работаю с django, на ней и решил остановиться. Примерная концепция — отдельные приложения для реализации каких-то своих функций. Для упрощения восприятия положим, что это блог, какое-то приложение для учёта каких-то действий, может аналог pastebin, прочее.

Делать SPA я не собираюсь, равно как и использовать какие-либо route, т.е. классическая схема обычного веб приложения. Но! Хочется добавить какой-то реактивности, например, логин форма xhr запросом логинит. Так же в бложике может быть markdown редактор, например. Т.е. в некоторых местах могут быть какие-то сущности, которые работают исключительно с api бекенда. Такая примерно идея.

Понимая, что уже 2к19 и использовать jQuery как минимум странно, я решил заюзать vue. Написал конфиг для webpack, чтобы удобно собирать это всё вместе с scss стилями по разным файлам и хочу интегрировать это в страницы обычного django.

Собственно вопрос. Я ознакомился с документацией и разными решениями и что я понял:

  • почти всегда vue позиционируется как SPA. Типа вот тебе #app и тут делай что тебе надо. Но мне надо не это.
  • да, есть решение, когда тебе нужно не это и это — portal-vue — типа всё так же регистрируешь один #app, но магией работы с DOM из инициализированного приложения можно достучаться до элементов извне. Как мне кажется, это довольно костыльный метод.
  • сделать несколько инстансов vue App. Например в подключаемом файле js пишем конструкции типа: if element.exists => new vue.App... — несколько костыльно, но в общем мне решение подходит, т.к. я могу при нахождении какого-то элемента на странице сделать его реактивным.

Собственно вопрос — неужели всё так печально? Ладно, я могу создать несколько элементов, но, вдруг, мне понадобится шарить между ними какие-то данные? Скидывать всё в localStorage и добавлять кругом разных eventListener чтобы всё это отслеживать? Так это очень похоже на jQuery подход.

Если у кого есть пример решения подобной проблемы и как с этим боролись — заранее благодарен.

 , ,

conformist
()

Django nested formset

Всем привет.

Вопрос по django formset. Допустим есть модель и относящаяся к ней вторая модель:

class SomeModel(models.Model):
    pass


class RelatedModel(models.Model):
    some_model = models.ForeingKey(to=SomeModel, ...)

Так же к ним обычные формы. Теперь, на странице может быть несколько SomeModel, для этого используем modelformset_factory:

SomeModelFormset = modelformset_factory(SomeModel, SomeModelForm, extra=2, can_delete=True)
some_model_formset = SomeModelFormset(request.POST, queryset=some_model_qs, prefix='sm')

Таким образом у нас может быть много форм SomeModel и к каждой из них нужно добавить таким же образом formset из RelatedModel.

Как один из вариантов — пройти по формам some_model_formset и к каждой из них создать отдельный formset из RelatedModel с префиксом — prefix='rm_%s % index_of_some_model_form' и потом так же в цикле валидировать эти формы.

Нет ли более изящного решения этой проблемы?

 , ,

conformist
()

Засыпает hdd во время просмотра фильмов/прослушивания музыки

Доброго времени суток.

Пролема в том, что основная система на ssd, а на hdd осталась помойка. При просмотра контента (конкретно музыка — deadbeef, фильмы — smplayer (бекэнд mpv)) — воспроизведение подвисает на доли секунды. Очень похоже, как будто плеер считал в буфер какое-то количество данных и до того времени, как он обратится за следующими данными — винт уже заснул. Он немного шумит, потому слышно, как он включается.

Собственно вопрос, как от этого избавиться?

OC: debian sid, DE: MATE, если это будет полезным.

 , ,

conformist
()

Не допустить читерства на backend

Доброго времени суток.

Есть проект на django, отдельно от него есть проекты на angular и react. На django есть система вознаграждений и она хранит так же вознаграждения за проведённое время в приложениях на angular/react. Разумеется для учёта этого времени из фронта делаются запросы на api django, чтобы сохранить результат.

Исходные данные — используется JWT (т.е. мы в принципе знаем, когда токен был получен (время жизни токена 15мин), так же есть refresh token). Нужно хранить 5-тиминутные отрезки времени. Т.е. пользователь провёл 5 минут — шлём запрос. Запросы с большим временем тоже можно, но меньше времени жизни токена (15мин).

Теперь вопросы и проблемы:

1) допустим токен был получен в 21.00, но это был refresh token и пользователь на самом деле был на сайте с 20.57 и, соответственно, в 21.02 придёт запрос на запись 5 минут. Как это валидировать? дать возможность 5 минутного сдвига до времени получения токена?

2) и более важный — это же простой xhr запрос с фронта. В принципе пользователь может изучить ключи этиз запросов и из какого нибудь postman/insomnia или обычным curl слать запросы постоянно — как защититься от этого?

Используется django rest framework + rest framework simplejwt. Production инстансы на domain.tld — django, subdomain1.domain.tld — клиент 1 и второй так же. Т.е. по идее можно было бы ограничить по хосту запросы, чтобы урегулировать второй вопрос. Кто-то делал подобное?

 , , , ,

conformist
()

Разные workplaces для разных мониторов

День добрый.

Имеется debian MATE, 2 монитора и 4 workplaces. Проблема в том, что переключая workplaces меняются окна на обоих мониторах, а хотелось бы чтобы на втором мониторе был отдельный workplace (например открыл окно и оно там статично). Похоже, что marco это не поддерживает, может был у кого опыт, как достичь этого?

 , ,

conformist
()

ISPConfig apache default virtualhost

Привет.

Есть vps с apache и opencart. Нормально работает, 2 конфига для http и https. Указывают на один каталог и там силами htaccess сделан редирект на https.

Захотел поставить ispconfig, который проживает обычно на отдельном порту (8080) и пытаюсь в него попасть. Вот тут странность, в конфиге ispconfig написано virtualhost _default_:8080, т.е. apache должен при запросе по этому порту перенаправлять на этот virtualhost. Но этого не происходит, при каждом запросе мне показывается сайт, а не панель.

Для проверки в обоих document root я создал файл test.php с разным содержимым (например, default и custom).

https://domain.tld/test.php → default
https://domain.tld:8080/test.php → default
http://ip:8080/test.php → bad request
https://ip:8080/test.php → default
В конфигах везде убрал _default_, заменив на *:443/*:80. Пробовал перенести на отдельный поддомен ispconfig, например: panel.domain.tld, порт 443 — открывает так же дефолтный сайт (т.е. SNI не работает, получается?). Не знаю что ещё предпринять.
root@domain:/etc/apache2/sites-enabled# apachectl -t -D DUMP_VHOSTS
VirtualHost configuration:
*:8081                 domain.tld (/etc/apache2/sites-enabled/000-apps.vhost:8)
*:80                   domain.tld (/etc/apache2/sites-enabled/000-default.conf:1)
*:8080                 domain.tld (/etc/apache2/sites-enabled/000-ispconfig.vhost:6)
*:443                  domain.tld (/etc/apache2/sites-enabled/default-ssl.conf:2

 , ,

conformist
()

Направить весь трафик на порт

Доброго времени суток. Есть желание направить весь исходящий трафик на определённый порт, на котором поднят ssh туннель. Пробовал sshuttle, но после его запуска по ssh подключиться к удалённой машине уже нельзя. Потому ищется простой способ как это сделать. Заранее спасибо.

P.S. openvpn, которым обычно решал проблему, запустить на удалённой машине нельзя (контейнер без tun/tap).

 , ,

conformist
()

Angular поиск элемента в списке

Доброго времени суток. Такой вопрос — есть диалог, в который загружается пачка элементов, допустим штук 20-30. Хочу добавить поисковую форму, похожую на md-autocomplete, но так, чтобы все элементы были видны, а если начинаешь набирать текст, то оставались только те, которые совпадают по фильтру. Сам md-autocomplete, насколько я понял, мне не подходит, т.к. он не показывает то, что загрузил, а только по мере набора.

Вот пример view, который сейчас:

<md-dialog-content ms-scroll>
  <md-list>
    <div layout="row" layout-align="center center" ng-show="vm.loading">
      <md-progress-circular md-mode="indeterminate" md-diameter="50"></md-progress-circular>
    </div>
    <md-list-item>
      <div flex class="md-list-item-text" layout="row">
        <div flex="70"><strong>Item</strong></div>
        <div flex="30"><strong>Saved</strong></div>
      </div>
      <md-divider></md-divider>
    </md-list-item>

    <md-list-item ng-repeat="item in items" ng-click="vm.selectItem(item)">
      <div flex class="md-list-item-text" layout="row" layout-align="none center">
        <div flex="70">
          <span class="text-truncate padding-right-25">{{ item.title}}</span>
        </div>
        <div flex="20">{{ item.modified_at | date:"dd/MM/yyyy" }}</div>
      </div>
      <md-divider></md-divider>
    </md-list-item>
  </md-list>
</md-dialog-content>

 ,

conformist
()

lightdm не запускает сессию с ~/.xsession

Доброго времени суток!

В общем понадобилось в debian, чтобы был обновлён PATH, хочу в него добавить каталог $HOME/.local/bin. В ubuntu это работало, но там DM вроде был sddm и он читал .profile, а lightdm не хочет, ему нужен .xsession. Я его создал и написал в нём следующее:

#!/bin/sh

if [ -d "$HOME/.local/bin" ] ; then
    export PATH="$HOME/.local/bin:$PATH"
fi

exit 0
После этого я не могу создать сессию. Притом в логах lightdm он никак это не мотивирует, пишет просто — получил сигнал 15, выход. Не пойму, что ему мешает работает, может кто сталкивался?

 , ,

conformist
()

Форматирование вывода vnstat

Доброго времени суток. В апплете МАТЕ command output хочу видеть количество потреблённого трафика. Раньше справлялся обычным awk, теперь решил чуть исправить вид.

Что хочу, что получилось:

~ vnstat -i enp3s0f5 --oneline
1;enp3s0f5;01/14/2018;164.21 MB;12.90 MB;177.11 MB;26.85 kbit/s;Jan '18;164.21 MB;12.90 MB;177.11 MB;1.27 kbit/s;164.21 MB;12.90 MB;177.11 MB
Вот так выглядит строка, которую нужно отформатировать. Интересуют 4-е и 5-е поле (если разбить с помощью ;), как хочу, чтобы оно выглядело: 164M/13M — т.е. округление и убрать букву B:
#!/bin/bash

function round_it(){
	count=${$1%.*}
	prefix=${$2%?}
	echo "$count$prefix"
}

IFACE=$(ip addr show | awk '/inet.*brd/{print $NF; exit}')
out=$(vnstat -i $IFACE --oneline)
IFS=';' array=($out)
down=${array[3]}
up=${array[4]}
echo $(round_it $down)
вот как написал, но не работает, жалуется на bad substitution, хотя в терминале если присвоить строку и разбить на массив — всё работает. Не пойму, где я накосячил.

Прошу помощи, заранее благодарен.

 

conformist
()

Загрузить содержимое файла в переменную

В общем сабж. Есть форма с двумя <input type=file>. Они могут быть выбраны, а могут быть и нет или выбран один из двух. Проблема в том, что файла 2 и я не могу выйти из callback сохранив данные для последующего запроса.

Что я делаю:

function loadFile(element, getData){
  var file = element.prop('files')[0];
  var reader = new FileReader();
  reader.onload = function(e){
    var data = e.target.result;
    getData(data);
  }
  reader.readAsText(file);
};
// Далее проверяю, есть ли в element класс, определяющий, что это
// поле с файлом и пытаюсь его загрузить:
if(left_code.hasClass('file')){
  loadFile(left_code, function(result){
    console.log(result);  // здесь всё загружено
});
но как мне сохранить этот result в переменную и потом сделать точно так же со вторым файлом? Можно попробовать сделать ещё один внутренний if для второго, но если не будет первого, а будет второй → получим кашу.

Пробовал варианты из гугла типа $.wait, но что-то не получается.

 ,

conformist
()

Определить idle или нет

Доброго времени суток. Пишу небольшой скрипт для себя с помощью python-xlib и потребовалось узнать мне, в какие моменты пк простаивает, чтобы это можно было отслеживать.

В гугле нашёл много ссылок на один и тот же кусок кода, в оригинале аж 2007-го года, который использует библиотеку C, но у меня сомнения:

1) неужели за это время не придумали ничего более удобного?

2) если всё же так, как мне это впихнуть в свой цикл?

Я использую в цикле next_event(), который ориентируется на Xlib.X.PropertyChangeMask: т.е. он реагирует на изменения в заголовках окон, например, и, когда пк неактивен, по идее вообще никаких event'ов происходить не будет.

Сразу лучше скажу зачем мне это: я хочу знать, сколько времени было открыто то или иное окно, но я не хочу засорять эти данные тем временем, когда пк бездействовал.

 , , ,

conformist
()

RSS подписка на новые темы