понедельник, 10 декабря 2012 г.

MySQL UTF-8


[client]
port = 3306
default-character-set=utf8

[mysqld]
port = 3306
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
default-character-set=utf8
character-set-server = utf8
collation-server = utf8_general_ci

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

user=mysql
old_passwords=1

[mysql]
default-character-set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

суббота, 3 ноября 2012 г.

Перезапуск приложения, если оно выжрало определенное количество памяти.

(с) Ivan Agarkov via fido7.ru.linux

#!/bin/sh
for FD in $(grep "$1" /proc/[0-9]*/comm); do
    PID="$(echo "$FD"|cut -d/ -f3)"
    MEM="$(cat /proc/$PID/statm|awk '{print $1}')"
    if [ "$MEM" -gt "$2" ]; then
        echo "$MEM > $2"
        # тут что-нибудь сделать
    fi
done

Первый аргумент - имя команды. Второй - кол-во памяти в байтах.
Hапример ./script.sh binkd 10240

четверг, 16 августа 2012 г.

Резервирование Asterisk

heartbeat + drbd.
heartbeat - отслеживает работоспособность основного сервера, если нет - берет управление на себя.
drbd - синхронизация файлов.

понедельник, 11 июня 2012 г.

Управление питанием USB

Управление питанием USB

Cтатья перепечатана с астерискфорум-а, автор статьи SERGII

Первый метод основан на стандартных возможностях USB устройства переходить в режим пониженого энергопотребления ("Suspend mode"). Для управления состоянием устройства в данном случае используется SYSFS:
echo suspend | sudo tee /sys/bus/usb/devices/1-4/power/level #переводит устройство, подключенное к 4 порту в Suspend mode
echo on | sudo tee /sys/bus/usb/devices/1-4/power/level #переводит устройство, подключенное к 4 порту в Нормальный режим
Таким образом можно частично переинициализировать некоторые устройства, в которых реализована данная функция.
Второй метод, авторами которого являются TANAKA Akira и NIIBE Yutaka, был первоначально разработан для управления питанием устройств питающихся из сети 220 В, и основан на патче (kernelspace реализация для ядра 2.6.14) и программе hub-ctrl (самодостаточная userspace реализация) написанными NIIBE Yutaka.
hub-ctrl - программа позволяющая управлять питанием USB портов, на USB хабах, поддерживающих данную функцию.

Использование программы hub-ctrl

./hub-ctrl #выводит список доступных хабов
./hub-ctrl -b 001 -d 004 -P 1 -p 0 #выключаем 1-й порт хаба, на шине 001:004
./hub-ctrl -b 001 -d 004 -P 1 -p 1 #включаем 1-й порт
Примечания
  • Реальный номер порта с тем, что нарисован на хабе может не совпадать!
  • На некоторых системах необходимо иметь права root'a чтобы данные действия имели эффект.
  • Следует знать что, питание полностью не отключается, а сбрасывается до определённого уровня. (у D-Link DUB-H7 H/WVer.: A5 - приблизительно до 1.4 В)

Как определить поддерживает ли хаб данную функцию?

Хабы сделаные на основе чипсетов поддерживающих данную функцию в выводе lsusb -v показывают строку "Per-port power switching":
...
Hub Descriptor:
...
wHubCharacteristic 0x0029
Per-port power switching
...
Это обязательный, но не достаточный признак того, что такой хаб будет работать по описаной схеме, т.к. производитель мог пустить цепь питания в обход чипсета.

Список известных хабов поддержывающих данную функцию

  • Elecom: U2H-G4S [1]
  • Sanwa Supply: USB-HUB14GPH [1]
  • Targus, Inc.: PAUH212 [1]
  • Hawking Technology: UH214 [1]
  • D-Link DUB-H7 (проверено на H/W Ver.: A5) [2]
  • NEC (ID 0409:0058 NEC Corp. HighSpeed Hub) [3]

Источники

1. http://www.gniibe.org/ac-power-by-usb/ac-power-control.html
2. http://www.asteriskforum.ru/viewtopic.php?t=5042&postdays=0&postorder=asc&start=1080
3. http://www.ip-phone-forum.de/showthread.php?p=1603698#post1603698

скрипт для проверки модемов на состояние Busy. Если есть какие-то подвисшие модемы, он сначала пераинициализирует их с помощью datacard reset, потом ждёт 45 сек. и если у каких-то модемов еще осталось состояние Busy то передёргивает питание средствами hub-ctrl. ВНИМАНИЕ: скрипт завязан на один D-Link DUB-H7, предполагается что имена карточек имеют вид gwX и зацеплены за соответствующий порт Х. В той же папке где лежит скрипт должен быть hub-ctrl.

#!/bin/bash
# Filename:      gsm-keeper
# Purpose:       This script checking for datacards which has "Busy" state
# Authors:       asteriskforum' users (asteriskforum.ru), (c) Sergey Fenko <foeckn[at]gmail.com>
# License:       This file is licensed under the GPL v2.
################################################################################

bus=$(lsusb | grep 2001:f103 | awk '{print $4$2}')
#looking for D-Link DUB-H7 hub bus, $bus will look like dev:bus
function hubctl {
if [ -e ./hub-ctrl ]
then
./hub-ctrl -b ${bus:4:3} -d ${bus:0:3} -P $1 -p 0
sleep 1
./hub-ctrl -b ${bus:4:3} -d ${bus:0:3} -P $1 -p 1
fi
}
for card in $(asterisk -rx "datacard show devices" | grep -i busy | awk '{print $1}' | sed '/gw*/!d' | sort)
do
channel=$(asterisk -rx "core show channels" | awk '{print $1}' | grep $card)
if [ -z "$channel" ];   then {
echo "$card is not assigned to any channel - probably freezed - REINITIALIZING"
asterisk -rx "datacard reset $card"
let WPWR=1
}
else
echo "$card is busy and assigned to channel $channel - OK"
fi
done
if [ "$WPWR" = "1" ]
then {
echo -e "Waiting some time for changes taking effect.\nIf any problems - will \"hard reset\"!"
sleep 45s
for card in $(asterisk -rx "datacard show devices" | grep -i busy | awk '{print $1}' | sed '/gw*/!d' | sort)
do
echo $card
channel=$(asterisk -rx "core show channels" | awk '{print $1}' | grep $card)                                                                 if [ -z "$channel" ]                                                                                                                                 then
echo "$card is not assigned to any channel - probably deeply freezed - REINITIALIZING (DOING HARD RESET!)"                                   hubctl ${card:2:1}                                                                                                                   fi
done
}
fi
Текст программы:
http://www.gniibe.org/software/hub-ctrl.c
#include <errno.h>
#include <usb.h>
#include <stdio.h>
#include <string.h>

#define USB_RT_HUB            (USB_TYPE_CLASS | USB_RECIP_DEVICE)
#define USB_RT_PORT            (USB_TYPE_CLASS | USB_RECIP_OTHER)
#define USB_PORT_FEAT_POWER        8
#define USB_PORT_FEAT_INDICATOR         22
#define USB_DIR_IN            0x80        /* to host */
#define COMMAND_SET_NONE  0
#define COMMAND_SET_LED   1
#define COMMAND_SET_POWER 2
#define HUB_LED_GREEN 2
static void
usage (const char *progname)
{
fprintf (stderr,
"Usage: %s [{-h HUBNUM | -b BUSNUM -d DEVNUM}] \\\n"
"          [-P PORT] [{-p [VALUE]|-l [VALUE]}]\n", progname);
}
static void
exit_with_usage (const char *progname)
{
usage (progname);
exit (1);
}
#define HUB_CHAR_LPSM        0x0003
#define HUB_CHAR_PORTIND        0x0080
struct usb_hub_descriptor {
unsigned char bDescLength;
unsigned char bDescriptorType;
unsigned char bNbrPorts;
unsigned char wHubCharacteristics[2];
unsigned char bPwrOn2PwrGood;
unsigned char bHubContrCurrent;
unsigned char data[0];
};
#define CTRL_TIMEOUT 1000
#define USB_STATUS_SIZE 4
#define MAX_HUBS 128
struct hub_info {
int busnum, devnum;
struct usb_device *dev;
int nport;
int indicator_support;
};
static struct hub_info hubs[MAX_HUBS];
static int number_of_hubs_with_feature;
static void
hub_port_status (usb_dev_handle *uh, int nport)
{
int i;
printf(" Hub Port Status:\n");
for (i = 0; i < nport; i++)
{
char buf[USB_STATUS_SIZE];
int ret;
ret = usb_control_msg (uh,
USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_OTHER,
USB_REQ_GET_STATUS,
0, i + 1,
buf, USB_STATUS_SIZE,
CTRL_TIMEOUT);
if (ret < 0)
{
fprintf (stderr,
"cannot read port %d status, %s (%d)\n",
i + 1, strerror(errno), errno);
break;
}
printf("   Port %d: %02x%02x.%02x%02x", i + 1,
buf[3], buf [2],
buf[1], buf [0]);
printf("%s%s%s%s%s",
(buf[2] & 0x10) ? " C_RESET" : "",
(buf[2] & 0x08) ? " C_OC" : "",
(buf[2] & 0x04) ? " C_SUSPEND" : "",
(buf[2] & 0x02) ? " C_ENABLE" : "",
(buf[2] & 0x01) ? " C_CONNECT" : "");
printf("%s%s%s%s%s%s%s%s%s%s\n",
(buf[1] & 0x10) ? " indicator" : "",
(buf[1] & 0x08) ? " test" : "",
(buf[1] & 0x04) ? " highspeed" : "",
(buf[1] & 0x02) ? " lowspeed" : "",
(buf[1] & 0x01) ? " power" : "",
(buf[0] & 0x10) ? " RESET" : "",
(buf[0] & 0x08) ? " oc" : "",
(buf[0] & 0x04) ? " suspend" : "",
(buf[0] & 0x02) ? " enable" : "",
(buf[0] & 0x01) ? " connect" : "");
}
}
static int
usb_find_hubs (int listing, int verbose, int busnum, int devnum, int hub)
{
struct usb_bus *busses;
struct usb_bus *bus;
number_of_hubs_with_feature = 0;
busses = usb_get_busses();
if (busses == NULL)
{
perror ("failed to access USB");
return -1;
}
for (bus = busses; bus; bus = bus->next)
{
struct usb_device *dev;
for (dev = bus->devices; dev; dev = dev->next)
{
usb_dev_handle *uh;
int print = 0;
if (dev->descriptor.bDeviceClass != USB_CLASS_HUB)
continue;
if (listing
|| (verbose
&& ((atoi (bus->dirname) == busnum && dev->devnum == devnum)
|| hub == number_of_hubs_with_feature)))
print = 1;
uh = usb_open (dev);
if (uh != NULL)
{
char buf[1024];
int len;
int nport;
struct usb_hub_descriptor *uhd = (struct usb_hub_descriptor *)buf;
if ((len = usb_control_msg (uh, USB_DIR_IN | USB_RT_HUB,
USB_REQ_GET_DESCRIPTOR,
USB_DT_HUB << 8, 0,
buf, sizeof (buf), CTRL_TIMEOUT))
> sizeof (struct usb_hub_descriptor))
{
if (!(uhd->wHubCharacteristics[0] & HUB_CHAR_PORTIND)
&& (uhd->wHubCharacteristics[0] & HUB_CHAR_LPSM) >= 2)
continue;
if (print)
printf ("Hub #%d at %s:%03d\n",
number_of_hubs_with_feature,
bus->dirname, dev->devnum);
switch ((uhd->wHubCharacteristics[0] & HUB_CHAR_LPSM))
{
case 0:
if (print)
fprintf (stderr, " INFO: ganged switching.\n");
break;
case 1:
if (print)
fprintf (stderr, " INFO: individual power switching.\n");
break;
case 2:
case 3:
if (print)
fprintf (stderr, " WARN: No power switching.\n");
break;
}
if (print
&& !(uhd->wHubCharacteristics[0] & HUB_CHAR_PORTIND))
fprintf (stderr, " WARN: Port indicators are NOT supported.\n");
}
else
{
perror ("Can't get hub descriptor");
usb_close (uh);
continue;
}
nport = buf[2];
hubs[number_of_hubs_with_feature].busnum = atoi (bus->dirname);
hubs[number_of_hubs_with_feature].devnum = dev->devnum;
hubs[number_of_hubs_with_feature].dev = dev;
hubs[number_of_hubs_with_feature].indicator_support =
(uhd->wHubCharacteristics[0] & HUB_CHAR_PORTIND)? 1 : 0;
hubs[number_of_hubs_with_feature].nport = nport;
number_of_hubs_with_feature++;
if (verbose)
hub_port_status (uh, nport);
usb_close (uh);
}
}
}
return number_of_hubs_with_feature;
}
int
get_hub (int busnum, int devnum)
{
int i;
for (i = 0; i < number_of_hubs_with_feature; i++)
if (hubs[i].busnum == busnum && hubs[i].devnum == devnum)
return i;
return -1;
}
/*
* HUB-CTRL  -  program to control port power/led of USB hub
*
*   # hub-ctrl                    // List hubs available
*   # hub-ctrl -P 1               // Power off at port 1
*   # hub-ctrl -P 1 -p 1          // Power on at port 1
*   # hub-ctrl -P 2 -l            // LED on at port 1
*
* Requirement: USB hub which implements port power control / indicator control
*
*      Work fine:
*         Elecom's U2H-G4S: www.elecom.co.jp (indicator depends on power)
*         04b4:6560
*
*       Sanwa Supply's USB-HUB14GPH: www.sanwa.co.jp (indicators don't)
*
*       Targus, Inc.'s PAUH212: www.targus.com (indicators don't)
*         04cc:1521
*
*       Hawking Technology's UH214: hawkingtech.com (indicators don't)
*
*/
int
main (int argc, const char *argv[])
{
int busnum = 0, devnum = 0;
int cmd = COMMAND_SET_NONE;
int port = 1;
int value = 0;
int request, feature, index;
int result = 0;
int listing = 0;
int verbose = 0;
int hub = -1;
usb_dev_handle *uh = NULL;
int i;
if (argc == 1)
listing = 1;
for (i = 1; i < argc; i++)
if (argv[i][0] == '-')
switch (argv[i][1])
{
case 'h':
if (++i >= argc || busnum > 0 || devnum > 0)
exit_with_usage (argv[0]);
hub = atoi (argv[i]);
break;
case 'b':
if (++i >= argc || hub >= 0)
exit_with_usage (argv[0]);
busnum = atoi (argv[i]);
break;
case 'd':
if (++i >= argc || hub >= 0)
exit_with_usage (argv[0]);
devnum = atoi (argv[i]);
break;
case 'P':
if (++i >= argc)
exit_with_usage (argv[0]);
port = atoi (argv[i]);
break;
case 'l':
if (cmd != COMMAND_SET_NONE)
exit_with_usage (argv[0]);
if (++i < argc)
value = atoi (argv[i]);
else
value = HUB_LED_GREEN;
cmd = COMMAND_SET_LED;
break;
case 'p':
if (cmd != COMMAND_SET_NONE)
exit_with_usage (argv[0]);
if (++i < argc)
value = atoi (argv[i]);
else
value= 0;
cmd = COMMAND_SET_POWER;
break;
case 'v':
verbose = 1;
if (argc == 2)
listing = 1;
break;
default:
exit_with_usage (argv[0]);
}
else
exit_with_usage (argv[0]);
if ((busnum > 0 && devnum <= 0) || (busnum <= 0 && devnum > 0))
/* BUS is specified, but DEV is'nt, or ... */
exit_with_usage (argv[0]);
/* Default is the hub #0 */
if (hub < 0 && busnum == 0)
hub = 0;
/* Default is POWER */
if (cmd == COMMAND_SET_NONE)
cmd = COMMAND_SET_POWER;
usb_init ();
usb_find_busses ();
usb_find_devices ();
if (usb_find_hubs (listing, verbose, busnum, devnum, hub) <= 0)
{
fprintf (stderr, "No hubs found.\n");
exit (1);
}
if (listing)
exit (0);
if (hub < 0)
hub = get_hub (busnum, devnum);
if (hub >= 0 && hub < number_of_hubs_with_feature)
uh = usb_open (hubs[hub].dev);
if (uh == NULL)
{
fprintf (stderr, "Device not found.\n");
result = 1;
}
else
{
if (cmd == COMMAND_SET_POWER)
if (value)
{
request = USB_REQ_SET_FEATURE;
feature = USB_PORT_FEAT_POWER;
index = port;
}
else
{
request = USB_REQ_CLEAR_FEATURE;
feature = USB_PORT_FEAT_POWER;
index = port;
}
else
{
request = USB_REQ_SET_FEATURE;
feature = USB_PORT_FEAT_INDICATOR;
index = (value << 8) | port;
}
if (verbose)
printf ("Send control message (REQUEST=%d, FEATURE=%d, INDEX=%d)\n",
request, feature, index);
if (usb_control_msg (uh, USB_RT_PORT, request, feature, index,
NULL, 0, CTRL_TIMEOUT) < 0)
{
perror ("failed to control.\n");
result = 1;
}
if (verbose)
hub_port_status (uh, hubs[hub].nport);
usb_close (uh);
}
exit (result);
}

среда, 29 февраля 2012 г.

Как объединить несколько видео файлов в один с помощью ffmpeg

Каждый файл сначала перекодируем с тем же качеством

ffmpeg –i video1.avi –sameq video1.mpg
ffmpeg –i video2.avi –sameq video2.mpg
ffmpeg –i video3.avi –sameq video3.mpg

И склеим
cat video1.mpg video2.mpg video3.mpg | ffmpeg –f mpeg –i - -sameq video.
 

понедельник, 16 января 2012 г.

vTiger Russian Language Pack

http://www.vtiger.com/crm-language-packs/russian-language-pack-for-vtiger-530/

Product Information - To be displayed on Product details page

Product Description
Product Description

Russian Language Pack for vtiger 5.3.0 produced by community.SalesPlatform.ru - Russian vtiger open-source community. Feel free to visit the community site for information and open-source downloads related to vtiger in Russia - beyond just localization.
Product Features: 1
Product Features
  • Basic localization

  • Localization of optional modules


  • Supports new features of vtiger 5.3.0

  • Download File URL
    http://sourceforge.net/projects/salesplatform/files/misc/LanguagePack_ru_ru_530.zip/download
    Download and Installation Instructions
    1. Download the zip file.
    2. Install the zip file in your vtiger 5.3.0 via Settings -> Module Manager -> Custom Modules tab -> Import New button.
    3. Open "My Preferences" page and select Russian language in the Language field.
    4. Refresh your browser page.
    Price
    Free
    Product License
    VPL
    Vtiger Versions
    version 5.3.0

    Company Information

    Company Name
    SalesPlatform Ltd
    Address Line 1
    Address:
    Polytechnicheskaya, 21
    Phone
    Phone: +78129439767
    Russian Language Pack for vtiger 5.3.0 produced by community.SalesPlatform.ru - Russian vtiger open-source community. Feel free to visit the community site for information and open-source downloads related to vtiger in Russia - beyond just localization.

    MySQL UTF-8

    [mysql]
    default-character-set=utf8

    [mysqld]
    collation_server=utf8_unicode_ci
    character_set_server=utf8
    default-character-set=utf8
    init_connect='SET collation_connection = utf8_general_ci'
    init_connect='SET NAMES utf8'