Виртуализация на уровне ОС. Теория и практика LXC
Александр Руденко
$ sudo apt-add-repository -y ppa:ubuntu-lxc/daily
$ sudo apt-get update --quiet
$ sudo apt-get install lxc
$ sudo lxc-create -t ubuntu -n u-001
$ sudo lxc-start -n u-001 –d
$ sudo lxc-console -n u-001
$ sudo lxc-attach -n u-001
$ sudo lxc-info -n u-001 или lxc-ls –fancy
$ sudo ssh ubuntu@IP-из-lxc-info
lxc-stop -n <имяКонтейнера>
$ sudo lxc-freeze -n <имяКонтейнера>
$ sudo apt-get install yum rpm
$ sudo lxc-create -t ubuntu -n u001 -B Btrfs
$ sudo Btrfs subvolume list /var/lib/lxc
$ sudo lxc-create -t ubuntu -n u001 -B lvm --vgname <имяГруппыТомов> --fssize 5G --fstype <типФайловойСистемы>
$ sudo lxc-snapshot -n u001
$ sudo lxc-snapshot -n u001 –L
$ sudo lxc-snapshot -n u001 -r snap0
$ sudo lxc-snapshot -n u001 -r snap0 u002
$ sudo lxc-clone -o <существующийКонт.> -n <новыйКонт.> -B Btrfs
$ sudo lxc-clone -o u001 -n u001-test -B overlayfs –s
$ sudo Btrfs subvolume list /var/lib/lxc
vi /etc/network/interfaces
# мост для lxc
auto br0 #имя моста и режим запуска
iface br0 inet static
bridge_ports eth0 # имя физического интерфейса «трубы»
bridge_fd 0
address 192.168.5.10
netmask 255.255.255.0
gateway 192.168.5.1
dns-nameservers 192.168.5.11
# sudo vi /var/lib/lxc/<имяКонтейнера>/config
# Тип сети
lxc.network.type = veth
# Сеть активна (up) или нет (down)
lxc.network.link = br0
# Имя сетевого адаптера внутри контейнера
lxc.network.name = eth0
# Имя сетевого адаптера для этого контейнера на хостовой
# машине
lxc.network.veth.pair = veth-u001
# IP-адрес контейнера
lxc.network.ipv4 = 192.168.5.15/24
# Шлюз контейнера
lxc.network.ipv4.gateway = 192.168.5.1
# mac-адрес адаптера
lxc.network.hwaddr = 00:16:3e:81:27:8e
$ sudo cd /proc/8897/root
lxc-info –n <имяКонтейнера>
$sudo vi /var/lib/lxc/<имяКонтейнера>/fstab
/var/store var/store none bind,create=dir
lxc.cgroup.memory.limit_in_bytes = 512M.
# так можно ограничить контейнер одним, первым по счету ядром
lxc.cgroup.cpuset.cpus = 0
# так будут выделены первое и второе ядра
lxc.cgroup.cpuset.cpus = 0,1
# а так можно задать три ядра
lxc.cgroup.cpuset.cpus = 0-2
# это для VM1
lxc.cgroup.cpu.shares = 512
# это для VM2 (1024 используется по умолчанию)
lxc.cgroup.cpu.shares = 1024
# для VM1
lxc.cgroup.blkio.weight = 500
# для VM2 (это максимальное значение)
lxc.cgroup.blkio.weight = 1000
-----------------------------------------------------------------------------------------------------------------
Установка Redmine и интеграция его с SVN
Рашид Ачилов
# mysql -u root -p
# Enter password:
# CREATE DATABASE redmine CHARACTER SET utf8;
# CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';
# GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
production:
adapter: mysql2
database: redmine
host: localhost
username: root
password: "my_password"
encoding: utf8
# bundle install –without development test
# rake generate_secret_token
# env RAILS_ENV=production rake db:migrate
# env RAILS_ENV=production rake redmine:load_default_data
# ruby script/rails server webrick -e production
production:
email_delivery:
delivery_method: :sendmail
scm_subversion_command: /usr/local/bin/svn
scm_mercurial_command:
scm_git_command:
scm_cvs_command: /usr/bin/cvs
scm_bazaar_command:
scm_darcs_command:
config.time_zone = 'Novosibirsk'
config.i18n.default_locale = :ru
#Logger.new(PATH,NUM_FILES_TO_ROTATE,FILE_SIZE)
config.logger = Logger.new('/var/log/production.log', 2, 1000000)
config.logger.level = Logger::INFO
# Пути, указанные passenger-install-apache2-module
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.29/buildout/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.29
PassengerDefaultRuby /usr/local/bin/ruby19
# Удалить некоторые HTTP-заголовки
Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"
# Настройки Passenger
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
PassengerMaxPreloaderIdleTime 0
PassengerLogLevel 0
PassengerDebugLogFile /var/log/httpd/passenger
RailsSpawnMethod smart
RailsAppSpawnerIdleTime 86400
# Имя сервера
ServerName redmine.deltahw.ru:80
LoadModule fcgid_module /usr/local/libexec/apache22/mod_fcgid.so
# Использовать FastCGI для .fcg .fcgi & .fpl скриптов
AddHandler fcgid-script fcg fcgi fpl
FcgidIPCDir /var/run/mod_fcgid
FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm
Listen *:3000
ServerName redmine.deltahw.ru
ServerAdmin rootp@deltahw.ru
CustomLog /var/log/http/redmine/access common
ErrorLog /var/log/http/redmine/httpd
DocumentRoot /usr/local/www/vhosts/redmine/public/
# Если вы используете mod_fcgid и хотите загружать файлы объемом больше, чем 131072 байта, настройте параметр соответствующим образом
# Данное значение позволяет загрузить файлы до 20 Мб
MaxRequestLen 20971520
RailsEnv production
Options Indexes ExecCGI FollowSymLinks
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from 170.70.70.1
Allow from 10.54.2.0/255.255.255.0
AllowOverride all
# pip install -U redmine-auth
# redmine-auth -g test.cfg
import redmineauth
DB_CONFIG = {
"dbn" : "mysql",
"host" : "127.0.0.1",
"port" : 3306,
"user" : "redmine",
"pw" : "redpwd",
"db" : "redmine_msk",
}
def check_password(environ, user, password):
return redmineauth.check_password(DB_CONFIG, user, password)
LoadModule wsgi_module /usr/local/libexec/apache22/mod_wsgi.so
AuthType Basic
AuthName "Redmine SVN repositories access"
AuthBasicProvider wsgi
WSGIAuthUserScript /etc/httpd/wsgi-auth.conf
/usr/local/bin/wget -o /tmp/file1 "http://redm.deltahw.ru/sys/fetch_changesets?key="
/usr/local/www/vhosts/redmine/extra/svn/reposman.rb
--redmine redmi.deltahw.ru
--key=6DPMel7XfQgrsmdZuLfb
--svn-dir /usr/local/share/svnroot
--owner nobody
--group www
--url http://svn.deltahw.ru/svn-private/
-----------------------------------------------------------------------------------------------------------------
Запускаем внутренний чат
Игорь Решетов
security.provider.10=net.za.darkskies.security.sasl.SSPIProvider
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI
-----------------------------------------------------------------------------------------------------------------
Сканер уязвимости OpenVAS
Сергей Яремчук
# apt-get dist-upgrade
# apt-get upgrade
# apt-get install openssh-server
# gpg --homedir=/usr/local/etc/openvas/gnupg --delete-secret-keys 94094F5B
# gpg --homedir=/usr/local/etc/openvas/gnupg --delete-keys 94094F5B
# openvasmd --create-credentials-encryption-key
# /etc/init.d/openvas-manager restart
# openvas-nvt-sync
# openvas-scapdata-sync
# openvas-certdata-sync
# openvassd
# openvasmd --rebuild
# killall openvassd
# /etc/init.d/openvas-scanner restart
# /etc/init.d/openvas-manager restart
# /etc/init.d/openvas-administrator restart
# /etc/init.d/greenbone-security-assistant restart
-----------------------------------------------------------------------------------------------------------------
AIX Security Expert, или Как настроить безопасность AIX в один клик
Анна Лагутина
ls -l /etc/security/aixpert
Maximum age for password: Specifies the maximum number of weeks (13 weeks) that a password is valid
bos.rte.date,bos.rte.commands, bos.rte.security,bos.rte.shell, bos.rte.ILS
/etc/security/aixpert/bin/chusrattr
maxage=52 ALL lls_maxage
Password policy rules
aixpert –l high –n –o / etc/security/aixpert/custom//high_security.xml
aixpert –f / etc/security/aixpert/custom/high_security.xml
# aixpert -l low
# echo $?
# cat /etc/security/aixpert/log/FAILEDRULES.log
Prereq rule for binaudit: Checks whether auditing is running or not
/etc/security/aixpert/bin/prereqbinaudit
# aixpert -l low
-----------------------------------------------------------------------------------------------------------------
«1С:Розница 8.2». Настройка скидок по дисконтным картам
Дмитрий Андриенко
Если ЗначениеЗаполнено(ЭтотОбъект.ДисконтнаяКарта) Тогда
// Проверка, есть ли у карты Зависимость (Ремомендатель)
Флаг = 0;
СписокРег = РегистрыСведений.ют_ПривязкаПоРекомендации.Выбрать();
Сообщить("Динамическое обновление");
Пока СписокРег.Следующий() = 1 Цикл
Сообщить("Владелец = "+СписокРег.Карта+" Новый = "+СписокРег.ТекКарта);
Сообщить(ЭтотОбъект.ДисконтнаяКарта.Наименование+" = "+СписокРег.ТекКарта);
Если СокрЛП(ЭтотОбъект.ДисконтнаяКарта.Наименование) = СокрЛП(СписокРег.ТекКарта) Тогда
Флаг = 1;
а = СписокРег.ТекКарта.Наименование;
с = СписокРег.Карта;
Сообщить("+++!! Владелец = "+СписокРег.Карта+" Новый = "+СписокРег.ТекКарта+" а = "+а+"Флаг = "+флаг);
КонецЕсли
КонецЦикла;
// Если найден, определяем уровни и зависимые карты, записываем во временную таблицу
Если Флаг=1 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ют_ПривязкаПоРекомендации.Регистратор,
| ют_ПривязкаПоРекомендации.НомерСтроки,
| ют_ПривязкаПоРекомендации.Карта,
| ют_ПривязкаПоРекомендации.ТекКарта
|ИЗ
| РегистрСведений.ют_ПривязкаПоРекомендации КАК ют_ПривязкаПоРекомендации";
Результат = Запрос.Выполнить();
РегСтр2 = Результат.Выгрузить();
Отбор = Новый Структура();
ТабУровни = Новый ТаблицаЗначений;
ТабУровни.Колонки.Добавить("Карта");
ТабУровни.Колонки.Добавить("Уровень");
Сообщить("Флаг = 1 б = "+с);
сч = 1;
Пока ЗначениеЗаполнено(с) Цикл
Сообщить("ЗначениеЗаполнено = "+с);
Стр = ТабУровни.Добавить();
Стр.Карта = с;
Стр.Уровень = сч;
Сч = сч + 1;
Отбор.Очистить();
Отбор.Вставить("ТекКарта", с);
Рез = РегСтр2.НайтиСтроки(Отбор);
Если рез.Количество()>0 тогда
с = Рез[0].Карта;
Сообщить("с = "+с);
а = с;
Иначе
с = Null;
КонецЕсли
КонецЦикла;
//Расчет процентов и запись в регистр накоплений
Отбор2 = Новый Структура();
СпрПр = Справочники.ют_ПроцентПоРекомендации;
РегНак = РегистрыНакопления.ПродажиПоДисконтнымКартам;
Движения.ют_ПроцентСРекомендаций.Записывать = Истина;
Движения.ют_ПроцентСРекомендаций.Очистить();
Для Каждого стр1 Из ТабУровни Цикл
Элем = СпрПр.НайтиПоРеквизиту("Уровень", стр1.Уровень);
Сумма = Элем.Процент * ↵
ЭтотОбъект.СуммаДокумента / 100;
Сообщить("Процент= "+стр1.Карта+" Уровень = "+стр1.Уровень+" Сумма "+ЭтотОбъект.СуммаДокумента+" Проц = "+Элем.Процент+" Сумма = "+сумма);
Движения.ПродажиПоДисконтнымКартам.Записывать = Истина;
Движение = Движения.ПродажиПоДисконтнымКартам.Добавить();
Движение.Период = Дата;
Движение.ДисконтнаяКарта = стр1.Карта;
Движение.Сумма = Сумма;
КонецЦикла;
КонецЕсли;
КонецЕсли;
-----------------------------------------------------------------------------------------------------------------
Праздничные котята от VK.com. kPHP – PHP со скоростью C++
Александр Календарев
sudo apt-get install libzip-dev
sudo apt-get install libssl-dev
$cd 'kPHP-kdb/re2
$make
$sudo make install
make kPHP
$objs/bin/kPHP2cpp
$objs/bin/kPHP2cpp -I/test -d/test/output test.php
$export kPHP_PATH=`pwd`/../../
$python2 kPHP.py test.php
$./test
$ python2 kPHP.py
python2 kPHP.py -n kPHPt/test.php
$ ./test -h
./test -H 8080
-----------------------------------------------------------------------------------------------------------------
CSS-препроцессоры – решение проблем стиля
Кирилл Сухов
#header {
h1 {
font-size: 26px;
font-weight: bold;
}
p { font-size: 12px;
a { text-decoration: none;
&:hover { border-width: 1px }
}
}
}
#header { color: black;
.navigation { font-size: 12px }
.logo { width: 300px;
&:hover { text-decoration: none }
}
}
@main-color: #5B83AD;
@light-color: (@ main-color + #111);
#header { color: @ main-color; }
#messageBox { color: @light-color; }
@var: #CCCCCC;
.class1 {
@var: #000000;
.class {
@var: #FF0000;
color: @var;
@var: #0000FF;
}
color: @var;
}
.messageBox{ color: @var; }
@myfont: Helvetica, Arial;
@var: 'myfont';
h1 {
font-family: @@var;
}
.messageBox{
@var: 3px;
border:@var solid #00ff00;
padding: @var * 3;
margin: @var + 20;
}
@color: #5B83AD;
div {
color: @color;
}
div button {
background: @color + #222222;
border: 2px solid @color - #111111;
}}
#header {
color: @color;
border-color: desaturate(@color, 10%);
}
@base: #f04615;
@width: 0.5;
div {
width: percentage(0.5); // returns `50%`
color: saturate(@base, 5%);
background-color: spin(lighten(@base, 25%), 8);
}
.messageBox{
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-o-border-radius: 5px;
}
.articleBox{
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-o-border-radius: 5px;
}
.rounded {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-o-border-radius: 5px;
}
.messageBox {
.rounded;
}
.articleBox {
.rounded;
}
.rounded(@r:5px) {
-webkit-border-radius: @r;
-moz-border-radius: @r;
-o-border-radius: @r;
}
.messageBox {
.rounded;
}
.articleBox {
.rounded(3px);
}
.myborder(@width: 1px, @color: #000000){
border:@arguments;
}
div {
.myborder(2px);
}
botton {
.myborder( 1px,#FF0000)
}
@link-color: #428bca;
.link {
color: @link-color;
}
a:extend(.link) {
font-weight: bold;
}
$ npm install less
var less = require('less');
less.render('.class { width: (1 + 1) }', function (e, css) {
console.log(css);
});
$ node less.js
@link-color: #428bca;
.link {
color: @link-color;
}
a:extend(.link) {
font-weight: bold;
}
a {
&:extend(.link);
font-weight: bold;
}
var less = require('less');
fs = require('fs');
var template = "style.less";
var str = fs.readFileSync(template, 'utf8');
var parser = new(less.Parser)({
paths: ['.', './less'],
filename: 'style.less'
});
parser.parse(str, function (error, tree) {
if (error) {
console.log(error);
} else {
var cssMin = tree.toCSS({ compress: true });
console.log(cssMin);
}
});
C:\Users\Geol\node\less>node less.js
{ selectors: null,
rules:
[ { name: '@link-color',
value: [Object],
important: '',
merge: undefined,
index: 0,
currentFileInfo: [Object],
inline: false,
variable: true },
{ selectors: [Object],
rules: [Object],
_lookups: {},
strictImports: undefined },
{ selectors: [Object],
rules: [Object],
_lookups: {},
strictImports: undefined },
{ selectors: [Object],
rules: [Object],
_lookups: {},
strictImports: undefined } ],
_lookups: {},
strictImports: undefined,
root: true,
firstRoot: true,
toCSS: [Function] }
body {
font: 12px Helvetica, Arial, sans-serif;
}
a.button {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
body
font 12px Helvetica, Arial, sans-serif
a.button
-webkit-border-radius 5px
-moz-border-radius 5px
border-radius 5px
textarea
input
background-color #fff
&:hover
background-color cyan
/* This is Nested */
body
padding 40px
p
text-align center
text-decoration underline
font-size 40px
> a
color blue
&:hover
color red
-webkit-border-radius 5px
-moz-border-radius 5px
border-radius 5px
border-radius()
-webkit-border-radius arguments
-moz-border-radius arguments
border-radius arguments
body
font 12px Helvetica, Arial, sans-serif
a.button
border-radius 5px
border-radius(n=5px)
-webkit-border-radius n
-moz-border-radius n
border-radius n
.messagebox
border-radius()
.button
border-radius(3px)
fonts = helvetica, arial, sans-serif
body
font 12px fonts
p.tip
font 10px fonts
borderWith = 2px
boxBorder = borderWith solid #FFCC00
div
border boxBorder
.Box
width: w = 150px
height: h = 80px
margin-left: -(w / 2)
margin-top: -(h / 2)
.Box
width: 150px
height: 80px
margin-left: -(@width / 2)
margin-top: -(@height / 2)
position()
position: arguments
z-index: 1 unless @z-index
.Box1
z-index: 20
position: absolute
.Box2
position: absolute
invmargin(n)
margin (- n)
.messageBox
invmargin(5px)
add(a, b)
a + b
times(a, b)
a * b
.messageBox
width: add(150px, 20)
height: add(80px,20)
margin-top: times(@height, 0.1)
margins(n)
n*15px n*10px n*15px n*10px
.messageBox
margin: margins(1)
.alertBox
margin-right: margins(2)[0]
add(a, b)
a + b
times(a = 2, b = add(a,4))
a * b
.messageBox
margin-top: times(4)
margin-left: times(4,2)
margin-right: times()
subtract(a, b)
a - b
.messageBox
margin: subtract(b: 10, a: 25)
compare(a, b)
if a > b
higher
else if a < b
lower
else
equal
$ npm install stylus
body
font 12px Arial, sans-serif
div.message_box
-webkit-border-radius 5px
-moz-border-radius 5px
border-radius 5px
var stylus = require('stylus');
fs = require('fs');
var template = "my.styl";
var str = fs.readFileSync(template, 'utf8');
stylus.render(str, function(err, css){
if (err) throw err;
console.log(css);
});
C:\Users\Geol\node\stylus>node stylus
// Define a mixin
border-radius()
-webkit-border-radius arguments
-moz-border-radius arguments
border-radius arguments
body
padding 40px
p
text-align center
text-decoration underline
font-size 40px
background blue
color white
border-radius 10
-----------------------------------------------------------------------------------------------------------------
Анимированная капча с использованием жестов рук
Артем Шумилов; Андрей Филиппович
this.rotateV = function(angle, idx) {
idx = idx || 0;
varrMatrix = new THREE.Matrix4();
if (idx == 0) {
vMatrix.makeRotationAxis(hAxis, angle * Math.PI / 180);
rMatrix.multiplyMatrices(hMatrix, vMatrix);
}else {
vartempMatrix = new THREE.Matrix4();
tempMatrix.makeRotationAxis(hAxis, angle * Math.PI / 180);
rMatrix.multiplyMatrices(hMatrix,
tempMatrix);
}
bones[idx].setRotationFromMatrix(rMatrix);
};
-----------------------------------------------------------------------------------------------------------------