Поиск по этому блогу

четверг, 4 июня 2015 г.

Пакетное изменение размеров и типа изображений в Linux

Понадобилось уменьшить размер изображений для сайта
Для этого решил уменьшить разрешение и сменить тип с png на jpg

Переходим в папку с изображениями

Пробую
$ for file in *.png; do convert $file -resize 900 -quality 75 resized-$file.jpg; done

По параметрам:

-resize 900 - ужимаем до 900пх по ширине, высота вычисляется автоматом
-quality 75 - качество сжатия jpg


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

Убираем пробелы

$ for i in *.png; do k=`echo ${i}|sed s/' '/'_'/g`;mv "${i}" ${k};done 

После этого конвертится нормально, вес файлов уменьшился раз в 10.
Минус такого подхода , что к имени файла в конец добавляется .jpg , то есть получается .png.jpg, но меня это устраивает на данный момент.



Инфу почерпнул здесь:
тыц и тыц 




четверг, 13 сентября 2012 г.

MySQL Workbench и fetching

Иногда пользуюсь бесплатным MySQL клиентом Workbench от разработчиков MySQL. Клиент, точнее клиент, админка сервера, построитель диаграмм по готовой базе или просто
диаграмм, отличный. Но глючит иногда довольно весело.
Вот сегодня отказался работать с одним из серверов - подключается, а таблицы не показывает. Fetching крутится и все. Причем другие клиенты работают с сервером нормально.
Решение нашлось неожиданное, пусть и в ожидаемом месте, в багтреккере MySQL http://bugs.mysql.com/bug.php?id=55008
Оказалось, что на сервере нужно вручную запустить скрипт обновления БД, после обновления самого MySQL, хотя сервер и под убунту и все обновления делались автоматически.

Спасительная команда в терминале:
# sudo  mysql_upgrade -u root -p




воскресенье, 9 сентября 2012 г.

Lazarus Ограничение длины вводимой строки

Сегодня моя логика разбилась в дребезги....

Понадобилось сделать ограничение на длину вводимой строки в TEdit. До этого было подобное в TStringGrid и всё отлично работало. Принцип работы такой создаем глобальную переменную, в неё, по событию изменения текста в объекте постоянно сохраняем текст из объекта, а когда длина текста превышает указанную, то нашему полю ввода присваиваем старое значение из глобальной переменной.

Начал делать такое на TEdit, кинул на форму, сделал событие OnChange и при тестировании приложения ловлю сигфолт, когда длина строки подходит к заданной. Делал много экспериментов, даже имена переменных менял...
Потом сделал отдельный проект для тестов. Но в нем ситуация оказалась аналогичная.



Собственно код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLProc;
type
  { TForm1 }
  TForm1 = class(TForm)
    edit: TEdit;
    procedure editChange(Sender: TObject);
  private
    { private declarations }
    fillAllLastVal:string;
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.editChange(Sender: TObject);
  //  ограничиваем количество символов
var
   value: string;
begin
  value := edit.text;
  if utf8length(Value) < 11 then
     begin
          fillAllLastVal:= edit.text;
      end
  else
     begin
       //  value:=fillAllLastVal;
         edit.text:=fillAllLastVal;
     end;
end;
end.   


Но этот пост заставило написать совсем другое, а именно, закомментированная строка         //  value:=fillAllLastVal;  Вставив которую(конечно раскомментировав), после кучи экспериментов, получил рабочий проект. ЭТО ПРОСТО ВЫНОС МОЗГА :) Почему так, понять не могу, а разбираться дальше времени нет.

Зато дальше сделал правильный метод ограничения длинны:

procedure TForm1.editChange(Sender: TObject);
begin
  if utf8length(edit.text) > MAX_SYMBOLS then
     begin
      edit.text := UTF8Copy(edit.text,1,MAX_SYMBOLS);
     end;
end; 

 Делалось под Kubuntu 12.04, Lazarus 1.0, fpc 2.60

понедельник, 21 февраля 2011 г.

Восстановление ReiserFS после форматирования в NTFS

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

Итак, имее
м:
1. Прерванное ПОЛНОЕ форматирование в
NTFS
2. Быстрое форматирование в
NTFS
3. Неудачную попытку восстановления раздела из-за которй он стал неразмеченной областью

После всего перечисленного попытка восстановить инфу носила лишь познавательный характер.
Начались скитания по Гуглу в поисках софта по восстановлению. Многое смотрел, пытался даже ставить - Линуксовые коммерческие даж не ставились на Kubuntu 10.10, виндовые пока не рассматривал, т.к. мастдай отсутсвует(не фанат какой-либо ОС, использую ту, которая лучше подходит по требованиям, сейчас это Линукс).
Экспериментировать на разделе в единственном экземпляре не очень хотелось.

Делаем полную копию раздела, чтоб вернуть если что:

dd if=/dev/устройство_раздела bs=4M of=/путь_к_файлу_резервной_копии

Таким образом была сделана полная копия раздела в файл.
bs=4M - это размер, в байтах(4М - 4 мегабайта), копируемых за такт, рекомендуют ставить равным размеру кеша винчестера.

Ну резервная копия через часик нарисовалась теперь можно и экспериментировать. Проводить опыты на живом диске рука не поднялась. Да и ведь в Unix мы!
Была-небыла, наугад - скажем что файл это устройство и запустим на нем обычную порверялку файловой системы. А вдруг?

sudo reiserfsck --check /путь_к_файлу_резервной_копии

И тут челюсть отвисает первый раз - проверка идет! reiserfsck ругнулась на пару ошибок и сказала что обязательно надо запуститься с параметром --rebuild-tree

sudo reiserfsck --rebuild-tree /путь_к_файлу_резервной_копии

попыхтев пару часов указала на несколько ошибок, что не всё удалось восстановить сказала: "Хозяин, готово, забирай!" :)

Пробуем примонтировать:

sudo mount -t reiserfs -o loop /путь_к_файлу_резервной_копии /куда_монтировать

Смотрим на результат и тут челюсть отвисает два - вся инфа восстановлена - десятки гигабайт, восстновлено дерево каталогов, все как было до армагедеца.

З.Ы.
Есть тут конечно элемент везения - спохватились рано, на раздел записи практически небыло да и полное форматирование тормознули вовремя, недобралось оно к нужным файлам.
Вполне возможно что метод поможет не только при форматировании в NTFS, а при форматировании в другие ФС.


воскресенье, 13 февраля 2011 г.

Учёт трафика для Linux десктопа (KDE)

Да, не весь интеренет еще безлимитный :(
Не мало ещё провайдеров, ограничивающих обьём трафика и считающих весь трафик выше нормы по бешеным ценам.
После продолжительного гугления и испытаний разных софтин для учёта трафика под Linux, остановился на KNemo. Для десктопа самое оно - просто настраивается, стабильно работает, автоматически запускается.

Скриншоты(зеленый цвет из-за темы KDE):


суббота, 12 февраля 2011 г.

Использование iconv на C++

Долгое время использовал преобразование кодировок при помощи Glib, функцией g_convert

Например преобразование из UTF-8 в Win-1251
g_convert(s.c_str(), -1, "cp1251", "utf-8", NULL, NULL, &error);

Но по непонятным причинам случайным образом эта функция под FreeBSD отказывалась преобразовывать в одном случае из тысяч из UCS2 в Win-1251 абсолютно нормальный текст, при этом отлично работая под Linux. Возможно причина кроется в том что приложение многопоточное и реализация многопоточности в Фре и Линухе различна. Но факт остается фактом - случайным образом во время преобразоания кодировки из библиотеки Glib на консоль вываливался варнинг, что неполучается использовать закрытый конвертер или чтот еще подобное, сейчас уже не помню и приложение благополчно падало в кор.
Поизучав исходники Glib решил написать свою функцию перекодирования, используя iconv.
Вот только вела она себя както странно.
После продолжительного гугления был найден действительно рабочий вариант http://www.opennet.ru/openforum/vsluhforumID9/4656.html#1 , отличавшийся от моего совсем не многим.
После небольшого тюнинга и проверки работоспособности получился такой вариант:

#include <iconv.h> //как минимум нужно подключить этот хеадер
...
string iconv_recode(string from, string to, string text)
{
iconv_t cnv = iconv_open(to.c_str(), from.c_str());
if (cnv == (iconv_t) - 1)
{
iconv_close(cnv);
return "";
}
char *outbuf;
if ((outbuf = (char *) malloc(text.length()*2 + 1)) == NULL)
{
iconv_close(cnv);
return "";
}
char *ip = (char *) text.c_str(), *op = outbuf;
size_t icount = text.length(), ocount = text.length()*2;

if (iconv(cnv, &ip, &icount, &op, &ocount) != (size_t) - 1)
{
outbuf[text.length()*2 - ocount] = '\0';
text = outbuf;
}
else
{
text = "";
}

free(outbuf);
iconv_close(cnv);
return text;
}

И тут есть момент, упущенный мною в своей неработающей функции. Смотрим строки
...
char *outbuf;
...
char *ip = (char *) text.c_str(), *op = outbuf;
...
if (iconv(cnv, &ip, &icount, &op, &ocount) != (size_t) - 1)

...

А именно в iconv, как параметр, для преобразованной строки передаётся &op, а не &outbuf, как у меня. Попытка в параметрах передать &outbuf вместо &op приводит к неожиданным результатам. Также в дебагере стало видно, что op и outbuf до вызова iconv(cnv, &ip, &icount, &op, &ocount) имеют одинаковый адрес, но после вызова iconv адреса разные. Результат работы iconv находится в outbuf, а op указывает на другой не коректный адрес

пятница, 16 июля 2010 г.

Проблемы с запуском C++ программ под Netbeans

Имеется Netbeans 6.8 на Kubuntu 10.04 64bit. При запуске разрабатываемых программ без какой либо переодичности Netbeans отказывался запускать, возвращая ошибку типа RUN FAILED (exit value 132, total time: 139ms) или Illegal instruction, и запускал программу со второго-третьего раза, что конечно огорчало. Решением проблемы стало отключение опции Show profiling indicators during run как показано на рисунке в Project Properties(правый клик по проэкту -> Properties -> Profiler)

вторник, 6 июля 2010 г.

Интересности Skype

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

воскресенье, 6 июня 2010 г.

Сделал системник тише!!!

Да давненько тут не писал. Ну ничего буду исправляться.

Имею 4-хядерник Core2 Q8200, работой полностью доволен. Изначально на нем была установлена очень бюджетная система охлаждения от Cooler Master, как боксовая. Но громкость работы это ужас, кулер колбасил 2500 об/мин субъективно с громкостью под 40 дБА :( Перепробовал все найденные рекомендации, менял настроки в биосе, но эффект отсутствовал. Уже подумывал о уставновке более тихого кулера с ручной регулировкой скорости, как вспомнил что кулер 3-хпиновый, а разьем на материнке 4-х. Оказалось что большинство материнских плат с 4-хпиновым разьемом не умеют регулировать скорость 3-хпиновых кулеров, как и моя ASUS P5K-VM.
В магазине единственной системой охлаждения с 4-хпиновым кулером оказался Cooler Master Hyper TX3, впрочем его брать и собирался. Сборка и установка прошла без проблем. В биосе выставил silent режим, что в комплекcе с тихим HDD от Hitachi, и silent видяхой даёт отличный результат.

суббота, 13 февраля 2010 г.

Счетчик рейтинга блогов Яндекса

Сегодня безжалостно удалил кнопку Яндекса, считающую рейтинг.
Причина - счётчик врет, статистика сильно не совпадает с гугловской аналитикой и часто вообще не работает.

пятница, 22 января 2010 г.

Apache 2.2.x + PHP 5.x.x = The requested operation has filed






Довелось ставить связку apache_2.2.14-win32-x86-no_ssl.msi и php-5.3.1-Win32-VC6-x86.msi на Windows2003, куда уже пытались  безуспешно установить Apache и PHP. Всё делалось красиво через инсталяторы. Апач установился, завелся. Ставлю ПХП, указываю путь к конфигу апача, он его правит на свое усмотрение. Перезапуск апача и вылетает месеж The requested operation has filed. Причем ошибка пропадала и сервер стартовал с отключеным в конфиге PHP.
Копание в нете не особо помогло, логи сервера чисты, мол все нормально я работаю :)
Подсказку нашел в логах системы, где указывалось что ошибка произошла с участием php5ts.dll .
Библиотека нашлась в установленном PHP и была на всякий случай скопирована в C:/windows/system32 . При копировании выяснилось, что там уже лежит библиотека с точно таким-же именем но другого размера! После копирования Апач запустился.
Для теста был сделан файл index.php:


<?
phpinfo();
?>

И при попытке зайти на него браузер показал пустую страницу. После небольших модификаций:

<?php
phpinfo();

?>

Появилась знакомая картинка :)

суббота, 9 января 2010 г.

Ubuntu 10.04 Alpha1 и драйвер NVIDIA

Решил посмотреть всетаки на новый дистрибутив. Установка проблем не вызвала. Как обычно после установки захожу в Драйверы устройств, выбираю рекомендуемый драйвер, устанавливаю.


Перезагрузка и ... приглашение в консоль.
После попытки вручную запустить X-сервер выяснилось что он не установлен.
Оказывается, что установка проприетарного дравера NVIDIA из убутновского репозитария начисто удаляет иксы:

$ sudo apt-get install nvidia-glx-185

Чтение списков пакетов... Готово
Построение дерева зависимостей
Чтение информации о состоянии... Готово
Следующие пакеты устанавливались автоматически и больше не требуются:
python-aptdaemon-gtk gnome-menus software-center python-webkit python-gmenu
Для их удаления используйте 'apt-get autoremove'.
Будут установлены следующие дополнительные пакеты:
aptdaemon dkms fakeroot gnome-menus nvidia-185-kernel-source
nvidia-185-libvdpau nvidia-settings patch python-aptdaemon
python-aptdaemon-gtk python-gmenu python-webkit software-center
xserver-common
Предлагаемые пакеты:
diffutils-doc
Пакеты, которые будут УДАЛЕНЫ:
xorg xserver-xorg xserver-xorg-core xserver-xorg-input-all
xserver-xorg-input-evdev xserver-xorg-input-mouse
xserver-xorg-input-synaptics xserver-xorg-input-vmmouse
xserver-xorg-video-all xserver-xorg-video-apm xserver-xorg-video-ark
xserver-xorg-video-ati xserver-xorg-video-chips xserver-xorg-video-cirrus
xserver-xorg-video-fbdev xserver-xorg-video-geode xserver-xorg-video-i128
xserver-xorg-video-i740 xserver-xorg-video-intel xserver-xorg-video-mach64
xserver-xorg-video-mga xserver-xorg-video-neomagic xserver-xorg-video-nv
xserver-xorg-video-openchrome xserver-xorg-video-r128
xserver-xorg-video-radeon xserver-xorg-video-rendition xserver-xorg-video-s3
xserver-xorg-video-s3virge xserver-xorg-video-savage
xserver-xorg-video-siliconmotion xserver-xorg-video-sis
xserver-xorg-video-sisusb xserver-xorg-video-tdfx xserver-xorg-video-trident
xserver-xorg-video-tseng xserver-xorg-video-v4l xserver-xorg-video-vesa
xserver-xorg-video-vmware xserver-xorg-video-voodoo xubuntu-desktop
НОВЫЕ пакеты, которые будут установлены:
aptdaemon dkms fakeroot gnome-menus nvidia-185-kernel-source
nvidia-185-libvdpau nvidia-glx-185 nvidia-settings patch python-aptdaemon
python-aptdaemon-gtk python-gmenu python-webkit software-center
Пакеты, которые будут обновлены:
xserver-common

Но это стало понятно уже когда иксы были удалены :)

Решение, если драйвера установили и иксы удалили:

1. Удаляем установленный драйвер NVIDIA:
$ sudo apt-get remove nvidia-glx-185

2. Ставим заново X-сервер:
$ sudo apt-get install xserver-xorg-core (могу ошибаться в названии пакета, пишу по памяти)

3. После перезагрузки с сайта NVIDIA http://www.nvidia.ru/Download/index.aspx?lang=ru скачиваем последний драйвер и устанавливаем.

среда, 14 октября 2009 г.

Текущая кодировка в Windows на C#

Узнать текущую кодировку в Windows можно при помощи

Encoding.Default.WebName

К примеру код:

MessageBox.Show(Encoding.Default.WebName);

Выводит следующее:

понедельник, 21 сентября 2009 г.

Установка программ в Wine


Низкий поклон и хвала разработчикам Wine http://www.winehq.org/ . Такую технологию сваяли! А вот установка софта не всегда прямолинейна, т.к. разные приложения требуют различных, порой существенных настроек в winecfg. Вспомнить хотябы установку Directx, это ж убиться веником (с) :)
Тут на помощь приходит Winetricks - утилита для автоматизированной установки многих приложений и библиотек, таких как тот же Directx или Internet Explorer 6, являющихся основой для многих Windows-приложений.

Подробнее о Winetricks http://wiki.winehq.org/winetricks , а скачать его можно командой
# wget http://www.kegel.com/wine/winetricks

понедельник, 31 августа 2009 г.

Как я MySQL-сервер на FreeBSD7.1 ставил

Как будто уже и не в первый раз на MySQL ставлю, а с таким еще не сталкивался.
Как обычно обновляю порты, захожу в порт с мускулом:

#cd /usr/ports/databases/mysql51-server

Далее как обычно:

#make

#make install

#mysql_install_db

Устанавливаю на базу юзера и группу как mysql:mysql

Пытаюсь стартануть сервер:

#/usr/local/etc/rc.d/mysql-server start

И пусто, нет привычной строки Starting mysql.

Запускаю клиент:

#mysql

И получаю:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Тоесть сервер не запущен.

Аналогично себя повел и mysqltest:

# mysqltest
mysqltest: Could not open connection 'default' after 500 attempts: 2002 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
not ok

После скитаний по интернету, портам, поиска логов и размышлений над правами начинается тупой перебор :(

Запускаю скрипт запуска MySQL, чтобы посмотреть на праметры:

# /usr/local/etc/rc.d/mysql-server
Usage: /usr/local/etc/rc.d/mysql-server [fast|force|one](start|stop|restart|rcvar|status|poll)
Заинтересовал параметр rcvar

Пробую:

# /usr/local/etc/rc.d/mysql-server rcvar
# mysql mysql_enable=NO

На всякий случай добавляю в /etc/rc.conf строку mysql_enable="YES"

Опять пробую:

# /usr/local/etc/rc.d/mysql-server rcvar

# mysql
mysql_enable=YES

Да, подтянуло параметр из /etc/rc.conf

После чего мистика :) - сервер запустился:

# /usr/local/etc/rc.d/mysql-server start
Starting mysql.

Как все просто оказалось на самом деле

понедельник, 3 августа 2009 г.

Преобразование числа в строку и обратно на C++ под Linux

По непонятной мне причине(или я ошибаюсь) в Linux отсутствует функция itoa - пробразование числа в строку,
хотя и реализована atoi - преобразование строки в число.
Для пробразования числа в строку рекомендутся использовать sprintf, как описано тут http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

/* sprintf example */
#include <stdlib.h>
int main ()
{
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a %d char long string\n",buffer,n);
return 0;
}

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

(листинг stringconvert.h)

#ifndef _STRINGCONVERT_H
#define _STRINGCONVERT_H
#include <string>
#include <sstream>

template <typename T>
std::string toString(T val)
{
std::ostringstream oss;
oss<< val;
return oss.str();
}

template <typename T>
T fromString(const std::string& s)
{
std::istringstream iss(s);
T res;
iss >> res;
return res;
}

#endif /* _STRINGCONVERT_H */

А использовать его очень просто:

(листинг main.cpp)

#include <stdlib.h>
#include "stringconvert.h"
#include <string.h>
#include <iostream>
/*
*
*/
using namespace std;

int main(int argc, char** argv)
{
//convert numbers to string
int i = 1234;
float f = 1234.12;
double d = -345.67;

string s_i = toString(i);
string s_f = toString(f);
string s_d = toString(d);

//print numbers converted to strings
cout << "Integer to string: " << s_i << endl;
cout << "Float to string: " << s_f << endl;
cout << "Double to string: " << s_d << endl << endl;

//convert string to numbers

string s_ii = "456";
string s_ff = "456.678";
string s_dd = "-890.45";

int ii = fromString<int>(s_ii);
float ff = fromString<float>(s_ff);
double dd = fromString<double>(s_dd);

//print strings converted to numbers
cout << "String to integer: " << ii << endl;
cout << "String to float: " << ff << endl;
cout << "String to double: " << dd << endl;

return (EXIT_SUCCESS);
}

Вывод программы:

Integer to string: 1234
Float to string: 1234.12
Double to string: -345.67

String to integer: 456
String to float: 456.678
String to double: -890.45

Преобразование происходит при помощи шаблонов
функций(о том, что это такое можно глянуть тут http://programmersclub.ru/29/ )

При преобразовании любого чисельного типа к строке можно не указывать из какого типа происходит преобразование, а вот из строки в число указывать нужно, что и видно в листинге.

пятница, 31 июля 2009 г.

Kernel Panic при обновлении Kubuntu с 8.04 до 9.04

Писал когдато пост, где плакался что такое обновление прошло неудачно http://dendroudnotes.blogspot.com/2009/05/kubuntu.html и закончилось переустановкой системы. Решил все же обновить систему на другой машине с 8.04 до 9.04 авось повезет. Не повезло :) Как рекомендуется на офсайте обновляю все пакеты и в апдейтере появляется кнопка "Обновить версию", нажимаю, запускается мастер обновления скачивает больше гига пакетов, распаковывает инсталит довольно долго. Приблизительно на 50% установки предлагает перезагрузиться. Перезагрузка и Kernel Panic.
Но решение всеже нашел!
Сразу после загрузки BIOS загрузчик предлагает нажать Esc для входа в меню загрузки. В меню предлагается загрузить одно из установленных ядер как в обычном, так и в режиме восстановления.

Новое ядро отказалось грузиться в любом из режимов, но какое-то из старых загружается, но ругается на недоступность каких-то тем при переходе к ГУИ режиму и забывает про клавиатуру и мышь.
Пробую загрузить его-же в режиме восстановления.
И т.к. ядро при нормальном запуске ругалось на то что чего-то не может найти выбираю dpkg Repair broken packages. Устанавливается оргромное количество пакетов, так понимаю те пакеты, которые небыли установленны при нормальном обновлении. Перезагружаюсь, старое ядро запускается и Kubuntu 9.04 отлично стартует.
По субьективному мнению KDE 4.2 работает намного быстрее нежели KDE 3.5 ну и конечно-же намного красивее.

суббота, 4 июля 2009 г.

FTP сервер за NAT на FreeBSD 7.1

Настройка маршрутизации для FTP протокола оказывается довольно сложная вещь и делал я это в первый раз, поэтому объективность поста может быть под вопросом, но тем не менее работает.

И так имеется:

-Интернет, откуда нужно открыть доступ к FTP-серверу;
-Машина с FreeBSD 7.1 и PF используемая в качестве роутера c внешним интерфейсом 100.100.10.123 и DMZ интерфейсом 192.168.0.1;
-DMZ с серверами, в том числе и FTP-сервером;
-FTP-сервер с адрессом 192.168.0.12, работающий на 1025 порту;

FTP использует пассивный режим, но простой редирект в PF почему-то не дал результата.

Решение было найдено при помощи ftp-proxy, который начиная с FreeBSD 7.0 идет в системе по умолчанию и не нуждается в установке.

Для начала нужно научиться вообще перенаправлять трафик при помощи ftp-proxy. Для этого с правами рута:

#
ftp-proxy -R 192.168.0.12 -p 21 -b 100.100.10.123 -P 1025

Тут 192.168.0.12 - IP FTP-сервера в DMZ, 100.100.10.123 - IP внешнего интерфйса, 1025 - порт, на котором запущен FTP-сервер, 21 - порт, на котороый подключаются пользователи из интернета.

И открыть 21 порт в фаэрволе, если он закрыт. Для этого в /etc/pf.conf вписать строчку

pass in on $ext_if inet proto tcp to $ext_ip port 21 flags S/SA keep state

где $ext_if имя внешнего интерфейса, а $ext_ip его IP-адресс и перезапустить фаэрвол:

#pfctl -f /etc/pf.conf

Если все получилось, то FTP-сервер должен отвечать на подключения извне(хотя подключения может и не произойти, но порт будет открытым и FTP-сервер увидит попытку подключения) , и в списке процессов должен появится запущенный ftp-proxy:

#ps ax|grep ftp-proxy
535 ?? Ss 0:07,99 ftp-proxy
537 ?? Ss 0:08,35 ftp-proxy -R 192.168.0.12 -p 21 -b 100.100.10.123 -P 1025


Проверить работоспособность сервера можно, к примеру, при помощи http://www.net2ftp.com/

Но это был старт "Вручную". Для того чтобы ftp-proxy запускался при старте системы я добавил /etc/rc.conf строку:

ftp-proxy -R 192.168.0.12 -p 21 -b 100.100.10.123 -P 1025

Возможно и не правильно, но рекомендованный способ запуска с указанием в rc.conf

ftpproxy_enable="YES"
ftpproxy_flags="-R 192.168.0.12 -p 21 -b 100.100.10.123 -P 1025"

НЕ ПОМОГ.

В /etc/pf.conf нужно добавить такие правила:

########## \ redirect ftp from internet/##################
#Якоря для ftp-proxy
nat-anchor "ftp-proxy/*"
nat on $ext_if inet from $int_dmz -> ($ext_if)
rdr-anchor "ftp-proxy/*"
###########################################

#################\ ftp filter rights/######################
pass in on $ext_if inet proto tcp to $ext_ip port 21 flags S/SA keep state
pass out on $int_dmz inet proto tcp to $ftpserv_ip port 21 user proxy flags S/SA keep state
anchor "ftp-proxy/*"
###########################################

Где:

$ext_if - внешний интерфейс;
$ext_ip - IP адресс интерфейса $ext_if
$int_dmz - интерфес роутера, смотрящий в DMZ сеть, в которой находится FTP-сервер;
$ftpserv_ip - IP адресс FTP-сервера в DMZ

Более подробно по настройке ftp-proxy можно почитать тут http://www.openbsd.org/faq/pf/ftp.html

четверг, 2 июля 2009 г.

Как ставить < > (знак больше/меньше) в HTML

Пришлось както вставить в заголовок блога знаки < > . Но оказалось что просто так знаки больше и меньше в загловок поста вставить не получится - они будут восприняты как HTML теги и не отобразятся, аналогично с ними будут такие же проблемы и в HTML. Для того чтобы их всетаки вставить, их нужно заменить на комбинации:
Для < "& lt;"
Для > "& gt;"
(без кавычек и пробелов после &)

Аналогично это работает и в HTML.

Полностью по спецсимволам можно глянуть тут: http://html.manual.ru/book/info/specialchars.php

понедельник, 1 июня 2009 г.

CURL в C++

Почитать про использование CURL можно тут