LINUX.ORG.RU

Сообщения DRVTiny

 

Динамически форма для ввода иерархических данных

Вкратце задача в том, что набить иерархическую структуру данных через обычные «юзер-понятные» формы

Изначально должна быть всего одна кнопка: «Добавить Банк»

При нажатии на «Добавить банк» под кнопкой должна появляться форма «Банка» с именем оного и кнопкой «Добавить площадку».

По нажатию на «Добавить площадку» внутри формы банка должна появиться формы для заполнения свойств площадки, на которой среди прочих будет и кнопка «Убрать площадку».

И т.д.

Т.е. суть в том, что формы: а) должны добавляться динамически; б) должны быть вложенными друг в друга (внутри формы банка можно добавить 10 площадок, в каждой из которых по 3 канала, например).

На выходе должен получиться JSON, который можно запостить на сервер.

Собственно, сами по себе формы умеет любой фреймворк, а вот такой вариант, с динамическим добавлением форм и вложенностью оных - есть где-нибудь?

Спасибо!

 ,

DRVTiny
()

DBIx::Threaded - кто-нибудь пробовал?

Собственно, весь вопрос в заголовке.

Проблема в том, что документация к этому модулю весьма странная: там вроде всё начинается за здравие, но потом происходит взрыв буков, растекание по древу о семистах ветках и нить повествования автора внезапно... теряется. А вместе с нею остаются осиротевшими без поддержки СУБД и те нити, которые могли бы здорово ускорить рекурсивный обход одной древовидной структуры в MySQL.

Я посмотрел тестовый пример - он зело огромен, как и документация, и с первого прохода по крайней мере тоже не шибко понятен. Мало того, этот самый тестовый пример не выполняется корректно при установке модуля из CPAN (5 тестов проходят нормально, а потом что-то заваливается набекрень и не едет).

Посмотрел на github'е примеры чужого кода с использованием этого модуля - ничего не путного нашёл (просто растиражированный сам этот модуль с его тестовым примером).

При этом сам разработчик, Dean Arnold, явно заслуживает доверия: несколько заумный товарищ, но вещи делает весьма впечатляющие (судя по github'у и беглому гуглению).

В общем, если кто-то имеет опыт работы с данным модулем или знает тех, кто имеет - прошу сообщить координаты себя или знающих людей :)

 , multithreaded,

DRVTiny
()

Скелетон ОО-класса, прячущего данные и автоподгружающего методы

Раньше писал с использованием Moose, а давеча решил попробовать написать скелет работоспособного класса на чистом Perl.

Получилось так:

use v5.14.1;
use utf8;
use strict;
package FRC::skel;
use Carp qw(croak);
use Data::Dumper;
our $AUTOLOAD;

sub new {
  my ($slfClass, %settings)=@_;
  my %privArea;
  
  my %attrs=(
    'name'=>undef,
  );
  
  sub attrUniAccessor {
    my ($attrName,$attrValue)=@_;
    say scalar($attrValue?'Set':'Get')." $attrName ".scalar($attrValue?'to value: '.$attrValue:'value');
    return undef unless exists($attrs{$attrName});
    my $hndlAttr=$attrs{$attrName};
    unless (ref($hndlAttr) eq 'HASH') {
      if ($attrValue) {
        return $privArea{$attrName}=$attrValue
      } else {
        return $privArea{$attrName}
      }
    } else {
      if ($attrValue) {
        return exists($hndlAttr->{'set'})?$hndlAttr->{'set'}->($attrValue):$privArea{$attrName}=$attrValue
      } else {
        return exists($hndlAttr->{'get'})?$hndlAttr->{'get'}->():$privArea{$attrName}
      }
    }
  }
  
  my (%methods, %cacheMethods);
  %methods=(
    'checkMethodExists'=>sub {
      my $method=shift;
      return [0, $methods{$method}] if exists($methods{$method});
      return [1, \&attrUniAccessor] if exists($attrs{$method});
      undef
    },
    'getMeOut'=>sub {
      say 'Get me out called!';
    },
    'DESTROY'=> sub {
      %methods=();
      %attrs=();
      say 'Ohh... You killed me :(';      
    }
  );
  
  my $obj=bless sub {
    my ($method,@pars)=@_;
    $method=~s%^.*::(.+?)$%$1%;
    printf "You called method %s with [%s]\n", $method, join(','=>@pars);
    return $methods{'checkMethodExists'}->(($pars[0]=~m/(?:^.+::)?(.+)$/)[0]) if $method eq 'checkMethodExists';
    croak "No such method: $method" unless my $realProc=$cacheMethods{$method} || do { $cacheMethods{$method}=$methods{'checkMethodExists'}->($method) };
    $realProc->[1]->(($realProc->[0]?$method:()),@pars);
  };
  while (my ($a,$v)=each %settings) {
    $obj->($a,$v);
  }
  return $obj;
}

sub AUTOLOAD {
  my ($slf)=@_;
  say "You attempted to do: $AUTOLOAD";
  no strict 'refs';
  my $method=$AUTOLOAD;  
  croak sprintf("No such method %s in package %s\n", $method, ref($slf))
   unless $method=~m/::(?:checkMethodExists|DESTROY)$/ or $slf->('checkMethodExists',$method);
  *{$method}=sub { my $slf=shift; $slf->($method,@_) };
  $method->(@_);
}

1;

Вывод «приложения», использующего этот класс, выглядит вот так (для примера)

You called method name with [Eihta Hamminess]
Set name to value: Eihta Hamminess
You attempted to do: FRC::skel::getMeOut
You called method checkMethodExists with [FRC::skel::getMeOut]
You called method getMeOut with []
Get me out called!
You attempted to do: FRC::skel::name
You called method checkMethodExists with [FRC::skel::name]
You called method name with []
Get name value
Eihta Hamminess
You called method getMeOut with []
Get me out called!
You called method name with [Kulvargia Zidatlis]
Set name to value: Kulvargia Zidatlis
You called method name with []
Get name value
My new name is: Kulvargia Zidatlis
You attempted to do: FRC::skel::DESTROY
You called method DESTROY with []
Ohh... You killed me :(

Собственно, от использования замыкания в качестве «сырья» для производства объекта отказываться точно не буду, от полной изоляции всех данных объекта, недоступности их для произвольной модификации извне - тоже.

Хотелось бы замечаний от тех, кто уже реализовывал что-то отдалённо похожее, но сделал это лучше (я всё ещё весьма далёк от понимания ООП,как удобной методологии разработки, и пока написал в ООП-стиле весьма немного).

P.S. pastebin.com залочен на работе, так что прошу прощения за эту адскую скатерть прямо в посте.

 ,

DRVTiny
()

Внешняя проверка веб-сайтов: есть ли сервис с поддержкой ssl client certificate?

Собственно, нужно проверять доступность веб-портала, закрытого от посторонних глаз HTTP-авторизацией по клиентскому SSL-сертификату.

Обыскал и опросил уже множество провайдеров данной немудрёной услуги - ни один почему-то не предполагает даже о том, что сайт их заказчиков может «не пустить» проверяющих в случае, если те не предоставят на этапе SSL-рукопожатия валидный сертификат. Серверный сертификат проверяют все. А вот предоставлять при этом правильный клиентский сертификат - не умеет никто.

Отсюда вопрос: есть ли «enterprise-ready» сервисы проверки веб-сайтов из множества локаций (обязательно российских), которые умеют работать с предоставленным заказчиком клиентским сертификатом SSL?

 ,

DRVTiny
()

Можно ли создать рекурсивную анонимную функцию?

Речь не о том, о чём вы подумали.

Нужно вызывать безымянную/анонимную функцию внутри себя самой, при этом не сохраняя её ни в каких переменных.

Это же Perl, Luke, должна быть такая фича.

При работе с рекурсивными функциями очень часто сталкиваешься с тем, что хочется чего-то типа map, только выполняющим рекурсивный обход дерева, при этом функции часто тупо одноразовые, никакого смысла давать им имена нет.

Анонимы на ЛОРе должны знать ;)

 , ,

DRVTiny
()

А есть ли «браузер внутри браузера» на JavaScript?

На JavaScript даже «операционные системы» пишут, так что наверное должен быть и «браузер внутри браузера». Я хотел бы развернуть у себя дома на белом IP-шнике Apache, закинуть туда исходники «браузера внутри браузера» - и заходить туда из особо анально огороженных мест. Конечно, придётся ограничить scope IP-шников, но это несложно. Так вот, есть ли такое чудесное web2.0-ное приложение как «браузер на JavaScript»?

Спасибо!

 ,

DRVTiny
()

Простой diff есть ли в Ansible? (сравнить local и remote файлы)

Нужно чтобы ansible:

  • Получил md5sum локального файла
  • Получил md5sum файла на удалённой системе
  • Сравнил их
  • Установил по результатам сравнения логическую переменную

    Не ахти какая сложная работа для столь мощного инструмента, ведь в результате copy-то он узнаёт, изменился файл или нет. Но дело в том, что мне не нужно ничего копировать, мне только сравнить нужно - и всё!

    Тем не менее, не нашёл я такого. Должна быть diff, ан нету diff'а. Пичаль...

    Что делать, как быть?

 

DRVTiny
()

Samba4: Великолепно, а где клиент?

Вопрос до прямолинейности глупый: Samba4 - контроллер домена, очень облегчает построение PDC «за пару сотен кликов по клавиатуре».

ОК. А... Где в Samba4 такая же чудесная клиентская часть? Чтоб пару команд вбил - и вуаля, работает!

По моему скромному ощущению, основанному на собственном же опыте, проект Samba при включении в чужой домен Windows (не ошибусь, если скажё, что это 99% случаев использования Samba в *nix) предлагает нам всё те же пляски с бубном, которые были в 3-й версии.

Да полноте, а не 3-ю ли версию Samba предлагает для включения компа в домен?

Ой да, кажется, то самое глючное бажное г-но и предлагает. То, которое меняло своё поведение в домене даже от простых обновлений. Сегодня работает - завтра обновил дистрибутив и не работает. Великолепно!

В общем, вопрос риторический: никому не кажется, что проект Samba идёт нога в ногу со временем? Когда вы последний раз видели людей, затюканных жизнью и начальством, отчаянно из последних сил пытающихся породнить что-нибудь вроде Exchange, Dynamics CRM или тем паче Sharepoint с PDC на Samba4? Ну да, пара кликов, всё чудесно... пока речь не идёт о софте, глубоко интегрированном с инфраструктурой Microsoft. А как давно вы видели людей, пытающихся составить магический ребус smb.conf, позволяющий открыть Linux'у дверь в мир лесистых трастовых доменов Windows?

Так почему Samba забила на клиентскую часть и пилит какой-то говно-PDC, который даром никому не нужен?

 

DRVTiny
()

Недоумения тред: таблица партиционирована, но файл frm всего один!

ОТВЕТ: https://www.packtpub.com/packtlib/book/Application-Development/9781783981540/...

Собственно, сделал кучку alter table'ов, данные в таблице разлились по партициям, что видно в information_schema.partitions. Но при этом файл данных для этой таблицы есть только один (всегда было так, что для каждой партиции - свой файл).

Собственно, почему могло так статься?

 CREATE TABLE `history` (
  `itemid` bigint(20) unsigned NOT NULL,
  `clock` int(11) NOT NULL DEFAULT '0',
  `value` double(16,4) NOT NULL DEFAULT '0.0000',
  `ns` int(11) NOT NULL DEFAULT '0',
  KEY `history_1` (`itemid`,`clock`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
/*!50100 PARTITION BY RANGE (clock)
(PARTITION p2016_02_21 VALUES LESS THAN (1456002000) ENGINE = InnoDB,
 PARTITION p2016_02_22 VALUES LESS THAN (1456174800) ENGINE = InnoDB,
 PARTITION p2016_02_23 VALUES LESS THAN (1456261200) ENGINE = InnoDB,
 PARTITION p2016_02_24 VALUES LESS THAN (1456347600) ENGINE = InnoDB,
 PARTITION p2016_02_25 VALUES LESS THAN (1456434000) ENGINE = InnoDB,
 PARTITION p2016_02_26 VALUES LESS THAN (1456520400) ENGINE = InnoDB,
 PARTITION p2016_02_27 VALUES LESS THAN (1456606800) ENGINE = InnoDB,
 PARTITION p2016_02_28 VALUES LESS THAN (1456693200) ENGINE = InnoDB,
 PARTITION p2016_02_29 VALUES LESS THAN (1456779600) ENGINE = InnoDB,
 PARTITION p2016_03_01 VALUES LESS THAN (1456866000) ENGINE = InnoDB,
 PARTITION p2016_03_02 VALUES LESS THAN (1456952400) ENGINE = InnoDB,
 PARTITION p2016_03_03 VALUES LESS THAN (1457038800) ENGINE = InnoDB,
 PARTITION p2016_03_04 VALUES LESS THAN (1457125200) ENGINE = InnoDB,
 PARTITION p2016_03_05 VALUES LESS THAN (1457211600) ENGINE = InnoDB) */

И при этом:

$ find /zbxdb/data/zabbix/ -name 'history*'
/zbxdb/data/zabbix/history.frm
/zbxdb/data/zabbix/history_uint.frm
/zbxdb/data/zabbix/history_str.frm
/zbxdb/data/zabbix/history_log.frm
/zbxdb/data/zabbix/history_text.frm
/zbxdb/data/zabbix/history.par
/zbxdb/data/zabbix/history_log.par
/zbxdb/data/zabbix/history_str.par
/zbxdb/data/zabbix/history_text.par
/zbxdb/data/zabbix/history_uint.par

 ,

DRVTiny
()

ZenOSS Core 5: какова реально минимальная конфигурация?

Коллеги!

У руководства возникла потребность увидеть Zenoss.

Ресурсов мало, всё на виртуалках.

Дефолтный Appliance 5-й версии настроен на 250Гб диска и 32Гб ОЗУ, что, мягко говоря, жирно.

Почитав документацию официальную и доки от весьма уважаемого в сообществе зеносевиков разработчика скрипта авторазвёртывания, узнал, что помимо кучи странных вещей наподобие XFS для корневого раздела и BTRFS с docker'ом вкупе, оно якобы всё равно хочет минимум 95Гб диска и 10Гб ОЗУ.

Внимание вопрос 1: Кто-нибудь ставил Zenoss Core 5?

Внимание вопрос 2: А какая у вас была при этом конфигурация?

Спасибо!

 , демостенд,

DRVTiny
()

Самый «правильный» join на BASH?

Довольно часто возникает задача вывести все элементы массива, вставив кастомный разделитель.

Решение в духе:

del=':'
join=${arr[@]}
join=${join//[[:space:]]/$del}

- работает только применительно к массивам, в которых почему-либо (внезапно!) элементы не содержат пробелов.

Решение с перебором элементов циклом:

del=':'
unset join
for ((i=0; i<${#arr[@]}; i++)); do
 join+=${join:+$del}${arr[i]}
done
- после Perl видится громоздким.

Может, я что-то упустил и есть некий аналог IFS для разделения элементов при выводе массивов операцией ${arr[@]} ??

 

DRVTiny
()

Поиск по массиву и x86-инструкция scas. Хочу scas!

Собственно, в этом примере:

void main () {
	short int a[5]={12,15,1,17,248};
	short int i=0;
	short int b=17;
	for (;i<(sizeof a/sizeof *a);i++) {
		if (a[i]==b) printf("Hello, %d\n",i);
	}
}

GCC упорно не хочет генерировать из этого самый простой и логичный в данном случае машинный код -

repne scasw

Генерируется вместо этого цикл с явным cmp.

Почему и как сделать так, чтобы GCC вспомнил о существовании scas с префиксом repne (повторять пока не установлен zero flag) при поиске по массиву?

Спасибо!

 , ,

DRVTiny
()

Популярность языка R и уровень развития государства/общества

У меня есть смутное подозрение, что уровень технической и социальной продвинутости государства прямо коррелирует с уровнем популярности R. Это связано прежде всего с той областью, в которой наиболее интенсивно используется R: математическая статистика. То есть уровень популярности R в первую очередь должен бы коррелировать со степенью «участия» науки в жизни людей той или иной страны, с тем, насколько «интеллектуально ёмкой» явялется её продукция. Ну и в конечном итоге - с индексом развития человека.

Есть ли где-нибудь инфографика на тему популярности R в разных странах мира?

 nowebshit,

DRVTiny
()

Почему df не видит /home в полном выводе?

В полном выводе df нет раздела /home:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda7       976M  581M  329M  64% /
none            4,0K     0  4,0K   0% /sys/fs/cgroup
udev             10M  4,0K   10M   1% /dev
none            512M  1,2M  511M   1% /tmp
tmpfs           789M  1,8M  788M   1% /run
none            5,0M     0  5,0M   0% /run/lock
none            2,0G     0  2,0G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/sda9       3,1G  1,4G  1,7G  45% /var
/dev/sda10       20G  3,6G   16G  19% /opt
/home/u01       189G  127G   63G  68% /u01
/dev/sda2       242M  100M  131M  44% /boot
/dev/sda8        20G   13G  6,5G  66% /usr
//server/ds     1,6T  762G  839G  48% /home/drvtiny/Shares/Fileserver/ds
//server/trash  2,3T  1,3T  1,1T  55% /home/drvtiny/Shares/Fileserver/trash
shmfs           4,0G  610M  3,5G  15% /dev/shm

Зато можно посмотреть занятое место для /home отдельно:

$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda11      189G  127G   63G  68% /home

Исчезновение /homе из полного вывода не связано с mtab:

$ fgrep sda11 /etc/mtab
/dev/sda11 /home ext4 rw,nodev,noatime 0 0
$ mount | fgrep sda11
/dev/sda11 on /home type ext4 (rw,nodev,noatime)

Разумеется, /home монтируется из fstab:

# /home was on /dev/sda11 during installation
UUID=1f2659fe-8a1d-4035-9d0d-a05d5771b1c5 /home           ext4    noatime,nodev        0       2

И с этим UUID всё ОК - это действительно sda11:

$ blkid -U 1f2659fe-8a1d-4035-9d0d-a05d5771b1c5
/dev/sda11

Уже не первый раз замечаю такой глюк: в полном выводе df видит не все смонтированные разделы.

С чем это может быть связано?

 

DRVTiny
()

Самый лаконичный способ сообщить об ошибке в Mojo?

Как сделать это?

Необходимо вернуть json с кодом и текстом ошибки, при этом завершив всю обработку запроса.

Например, что-то вроде этого:

my %Erc2HTTP=(
  101=>404,
  102=>403,
  103=>401,
  104=>404,
);
$someObj->exception(message=>'No such meteostation', code=>101);
# Обработчик исключения
sub hndlException {
 my ($c,%pars)=@_;
 $c->render(
   json=>{
     'error'=>$pars{'message'}
     'erc'=>$pars{'code'} 
   },
   code=>$Erc2HTTP{$pars{'code'}},
 );
 $c->finish();
}
В результате, после $c->finish вся обработка запроса будет завершена, никакие after_dispatch'и вызываться не будут.

Это возможно в Mojolicious?

 , ,

DRVTiny
()

Какой аккаунт использует Winbind для получения доменной информации?

Вопрос возник в связи с практически неработающим назначением прав на вложенные группы: несмотря на прописаные

 
winbind expand groups = 255
winbind nested groups = yes

samba упорно не желает видеть, например, группы из домена B, вложенные в группы из домена A. Хотя те же группы из домена B, если они не вложены никуда, без проблем могут быть использованы при назначении прав доступа к шарам.

Появились сомнения в том, что машинный аккаунт «Workstation$», который, как я предполагаю, как раз-таки и юзает winbind, почему-либо не имеет полномочий на чтение содержимого пользовательских групп.

Какой аккаунт юзает Samba для чтения всякой полезной информации из домена Active Directory и как бы дать этому аккаунту побольше полномочий?

Спасибо!

 ,

DRVTiny
()

OpenSource: попробовав раз, ем и сейчас!

Определённо, для OpenSource проблема разработчиков, бросающих свои детища по тем или иным причинам - самая актуальная и сама болезненная. А в результате этого те же крупные государственные проекты, которые склоняют к «ура опенсорсу!» - запросто могут трансформироваться в проекты финансируемой государством разработки OpenSource-софта: ведь лицензии на исходный софт чаще всего не позволяют дорабатывать его и при этом не предоставлять исходники.

Как вы относитесь к тому, что используя любой не-mainstream'овый OpenSource-проект (а зачастую и mainstream'овый тоже...) - Вы всегда должны быть готовы «подхватить» заглохшую разработку, дабы гальванизировать труп собственными силами?

 

DRVTiny
()

Можно ли сделать пред и постобработчики для всех URL'ов в Mojo?

Собственно, для реализации единой логики кеширования хочу сделать некий «хук», позволяющий делать пред и постобработку запросов к API.

Общий для всех URL'ов предобработчик должен посмотреть, не закончилось ли для данного /target'а время кеширования результата запроса с момента последнего получения «живых данных» и, если ещё нужно кешировать - он должен просто вернуть данные из кеша, завершив всю обработку.

Обработчики для конкретных URL'ов (например, для «/weatherinfo» или «/currency») - должны получить свежие, «живые» данные, поскольку предобработчик не завершил цикл, а значит - данные в кеше протухли

Постобработчик, единый для всех URL'ов, должен записывать полученные обработчиком для конкретного URL'а «живые данные» в кеш (в Redis, если на то пошло) и обновлять метку времени последнего получения «живых данных» для данного URL.

Перечитал по диагонали пока документацию по Mojolicious::Lite - ничего подобного не нашёл. Может, плохо смотрел.

Для Mojolicious есть какой-то хитрый вариант навешивания последовательных обработчиков на промежуточные элементы route-дерева, но... этот обработчик будет выполнен только до обработчика конечного узла, то есть «листа». Мне же нужно, чтобы и после обработчика «листа» тоже что-то запускалось - а именно запись в кеш полученных живых данных и времени их получения.

Мне очень не хочется выносить хоть какую-то общую абсолютно для всех URL'ов логику в каждый «конкретный» обработчик, мне кажется, что в обработчике для URL'а нужно оставить только его собственную узкоспецифичную логику.

В общем... буду рад конструктивным идеям по реализации желаемого, а именно общей для всех URL'ов пред и постообработки, на базе Mojolicious (желательно Lite-версии).

Спасибо!

 ,

DRVTiny
()

Вроде бы простой rewrite...

Я совсем недавно начал пользоваться nginx для своих нужд и что-то явно туплю: не могу перезаписать «/app» на просто «/» вот в каком случае:

Конфигурация:

NGINX при обращении к /app передаёт запрос на Morbo (сервер для Monolicious-приложений), который на 127.0.0.1:3000

upstream myapp {
  server 127.0.0.1:3000;
}

server {
  ...
  ...
  location /app {
#    rewrite ^/app(/(.*))?$ /$2 last;
    proxy_pass http://myapp;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Мне нужно, что запрос /app/hello приходил приложению, запущенному под Morbo (Mojolicious-приложение), как просто /hello.

rewrite, который закомментирован в конфигурации, я уже как только не менял - ничего не помогает: либо в Morbo запрос приходит с /app частью, либо он перезаписывается на тот же /hello и вообще, зараза, в Morbo не попадает.

Как же так? ЧЯДНТ? И как сделать правильно?

Спасибо! ;)

 , ,

DRVTiny
()

Открытый справочный web-api ищет доменное имя

Есть такая простая мысль: сделать открытый справочный web-api, где запросы и ответы будут в JSON (API конечно ориентировано на AJAX-запросы).

Узнать можно будет поначалу: NTP-время, курсы валют, прогноз температуры воздуха, давления и влажности в точке (GFS-данные) - и т.д.

В итоге хотелось бы просто сайт или даже семейство сайтов, предоставляющих полезную информацию по запросу. Только полезную информацию. Никакого HTML'я, JavaScript'а, Flash'а и прочего...

Такая себе No Bull Shit - инциатива.

Коммерциализация этого хозяйства если и будет, то нескоро, поэтому - все, кому интересно - welcome.

Для начала есть оплаченный хостинг, но нет доменного имени. Если у кого-нибудь есть неплохое доменное имя, которым можно поделиться - делитесь. К сожалению, simple.info, как ни странно, занято, nobullshit'ы - тоже, поэтому ныне в поисках я пребываю.

Буду рад конструктивным идеям и предложениям.

 , , , nobullshit

DRVTiny
()

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