zlmon (ZeroLab Monitor) — Мониторинг доступности серверов

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

Поэтому я написал небольшой shell-скрипт, решающий исключительно эту узкую задачу – zlmon (ZeroLab Monitor).

zlmon.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash

# --------------------------------------------
# zlmon (ZeroLab Monitor):
# Written by ZeroChaos
# Version 1.0, 2015-02-17
# Site: https://zerolab.net/
# --------------------------------------------

DIR=$(dirname "$0")
HOSTLIST=$DIR/hostlist.txt
SUBJECT="Alert: Host down!"
EMAIL="e@mail.net"

while read ADDRESS; do
    if [ ! -f /tmp/zlmon-$ADDRESS ]; then
        echo 0 > /tmp/zlmon-$ADDRESS
    fi
    COUNT=`head -1 /tmp/zlmon-$ADDRESS`
    if ping -c 1 -s 1 -W 1 $ADDRESS; then
        echo 0 > /tmp/zlmon-$ADDRESS
    else
        # Notify (no more than 5 times)
        if [ $COUNT -lt 5 ]; then
            echo -e "Connection Lost!\n\nHost: $ADDRESS\nTime: `date +'%Hh%Mm'`" | mail -s "$SUBJECT ($ADDRESS)" $EMAIL
        fi
        ((COUNT++))
        echo $COUNT > /tmp/zlmon-$ADDRESS
        # Clear counter
        if [ $COUNT -gt 60 ]; then
            echo 0 > /tmp/zlmon-$ADDRESS
        fi
    fi
done < $HOSTLIST

» Читать далее »

NFS mount on the OS X Mountain Lion and realtime encrypt files with EncFS

Уверен, что многие столкнулись с проблемой монтирования NFS (Network File System) из под OS X Mountain Lion. В этой версии Apple выпилила привычный инструмент монтирования через Disk Utility. Многие начали изобретать велосипеды или пользоваться чем-то вроде NFS Manager. Вот только все это ни к чему, достаточно внимательно почитать man и правильно настроить NFS Server. Пройдемся пошагово.

Для начала установим NFS Server на нашем *nix’овом сервере (в моем случае Debian):

1
apt-get install nfs-kernel-server nfs-common portmap

Правим ‘/etc/exports’ и прописываем монтируемые каталоги с правильными опциями:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# /etc/exports: the access control list for filesystems which may be exported
#       to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#

/hdd1/Downloads 192.168.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=1002,anongid=1002,insecure) 10.10.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=1002,anongid=1002,insecure)
/hdd1/webdav/itunes 192.168.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33,insecure) 10.10.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33,insecure)
/hdd1/webdav/efs 192.168.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33,fsid=1,insecure)

Ключевой здесь является опция ‘insecure’, по сути, она избавляет от необходимости в опции ‘resvport’ на стороне клиента, которую раньше можно было выставить в Disk Utility. Опция ‘resvport’ применяется в случае, если NFS-сервер работает на привилегированном порту (ниже 1024), по умолчанию же, OS X пытается подключиться к NFS-серверу на непривилегированном порту, вот мы и повесим NFS на него, используя опцию ‘insecure’. Не забудьте исправить ‘anonuid’ и ‘anongid’ на uid и gid того пользователя и группы, из под которых хотите, чтобы велась запись. Обратите внимание на ‘fsid=1’, добавьте эту опцию для шары, в которой будет использоваться EncFS. Ну и не забудьте поменять разрешенные подсети на свои.

Перезапускаем сервис:

1
/etc/init.d/nfs-kernel-server restart

Чтобы посмотреть какие ресурсы предоставлены:

1
showmount -e

Если вы только добавляли ресурсы в файл ‘/etc/exports’, то их можно активировать без перезапуска службы NFS:

1
exportfs -a

Теперь перейдем к настройке EncFS, для упрощения я написал небольшой скрипт, подробно его прокомментировав, тем самым, не вижу смысла дублировать пояснения:

1
nano /usr/local/bin/efs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/bin/sh

# ----------------------------------------------------------------------------
# Simple script for EncFS with NFS access
# Written by ZeroChaos
# Version 1.0, 2013-02-26
# Site: http://zerolab.net/
# ----------------------------------------------------------------------------
## Install EncFS:
# apt-get install encfs
## If we mount under another user (with option "--public" it's not necessary):
# adduser username fuse
## RTM!:
# man encfs
## Just replace the variables $EFS_FOLDER and $MOUNT_POINT, and then run:
# efs -m
## For unmount:
# efs -u
## For force unmount:
# efs -f
# ----------------------------------------------------------------------------

# Are you using NFS for access to decrypted folder?
NFS_ACCESS="yes"

# Variables for encfs command
EFS_FOLDER="/hdd1/efs"
MOUNT_POINT="/hdd1/webdav/efs"
OPTIONS="--public"
#OPTIONS="--public --idle=60"
MNT_CMD="encfs $OPTIONS $EFS_FOLDER $MOUNT_POINT"
# If we mount under another user
#RUNAS="username"
#MNT_CMD="su - $RUNAS -c "encfs $EFS_FOLDER $MOUNT_POINT""

# Mount
mount() {
    $MNT_CMD
}

# Unmount
umount() {
    if [ $NFS_ACCESS = "yes" ]; then
        /etc/init.d/nfs-kernel-server stop >/dev/null 2>&1
        sleep 1
    fi
    fusermount -u $MOUNT_POINT
    if [ $NFS_ACCESS = "yes" ]; then
        sleep 1
        /etc/init.d/nfs-kernel-server start >/dev/null 2>&1
    fi
}

# Force unmount
force_umount() {
    ps ax | grep [e]ncfs | awk '{ print $1 }' | xargs kill >/dev/null 2>&1
    if [ $NFS_ACCESS = "yes" ]; then
        /etc/init.d/nfs-kernel-server restart >/dev/null 2>&1
    fi
}

ME=$(basename "$0")
print_help() {
    echo
    echo "Usage: $ME [OPTION...]"
    echo
    echo "Options:"
    echo "         -m     Mount:"
    echo "                efs -m"
    echo "         -u     Unmount:"
    echo "                efs -u"
    echo "         -f     Force unmount:"
    echo "                efs -f"
    echo "         -h     Help."
    echo
}

while getopts ":mufh" opt;
do
    case $opt in
        m) mount;
            ;;
        u) umount;
            ;;
        f) force_umount;
            ;;
        h) print_help;
            ;;
        *) echo "Wrong option";
            exit 1
            ;;
        esac
done
1
chmod 755 /usr/local/bin/efs

Вот и все, теперь монтируем шару через Finder (CMD+K):

» Читать далее »

ZLU (ZeroLab Unisync): remote & local automated backup script

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

Итак, ZLU (ZeroLab Unisync):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/bin/sh

# --------------------------------------------
# ZLU (ZeroLab Unisync):
# remote & local automated backup script
# Written by ZeroChaos
# Version 1.5, 2012-11-20
# Site: http://zerolab.net/
# --------------------------------------------
# NOTE: Exclude spaces in the variable FOLDER!
# --------------------------------------------

# -------------------------------------------- begin of [Configurable settings]
# Use SSH for remote sync
export RSYNC_RSH="ssh -c arcfour -o Compression=no -x"

# Snapshot directory
SDIR="snapshot"
SNAPSHOT_dir="$SDIR/`date +'%Y-%m-%d.%Hh%Mm'`"

# Take the list from the same folder where the script is called
DIR=$(dirname "$0")
LISTFOLDERS="$DIR/backup.txt"
EXCLUSIONSDIR="$DIR"
# -------------------------------------------- end of [Configurable settings]

# -------------------------------------------- begin of [Do not touch this section]
# If no arguments
if [ $# = 0 ]; then
    SNAPSHOT_GLOBAL="disable"
    i=0
    while read LINE; do
        if [ -n "$LINE" ]; then
            IFS=";"
            set -- $LINE
            FOLDER="$1"
            DEST_point="$2"
            LISTEXCLUSIONS="$EXCLUSIONSDIR/$3"
            SNAPSHOT="$4"
            SDAYS="$5"
            REMOTEHOST="${6}@${7}"
            FOLDERNAME="`echo "$FOLDER" | awk -F/ '{ print $NF }'`"
            # Options for rsync + array of commands to autorotation
            if [ $SNAPSHOT = "enable" ]; then
                SNAPSHOT_GLOBAL="enable"
                if [ "$6" != "" ] && [ "$7" != "" ]; then
                    OPTIONS="-Sazq --bwlimit=3840 --delete --exclude-from=$LISTEXCLUSIONS --backup --backup-dir=${DEST_point}${SNAPSHOT_dir}/$FOLDERNAME"
                    SAR[$i]="ssh $REMOTEHOST "find ${DEST_point}${SDIR}/ -type d -mtime +$SDAYS -exec rm -r {} \;" >/dev/null 2>&1"
                    i=$(($i+1))
                else
                    OPTIONS="-Saq --delete --exclude-from=$LISTEXCLUSIONS --backup --backup-dir=${DEST_point}${SNAPSHOT_dir}/$FOLDERNAME"
                    SAR[$i]="find "${DEST_point}${SDIR}/" -type d -mtime +$SDAYS -exec rm -r {} \; >/dev/null 2>&1"
                    i=$(($i+1))
                fi
            else
                if [ "$6" != "" ] && [ "$7" != "" ]; then
                    OPTIONS="-Sazq --bwlimit=3840 --delete --exclude-from=$LISTEXCLUSIONS"
                else
                    OPTIONS="-Saq --delete --exclude-from=$LISTEXCLUSIONS"
                fi
            fi
            # Sync
            if [ "$6" != "" ] && [ "$7" != "" ]; then
                eval rsync $OPTIONS "${FOLDER}/" $REMOTEHOST:"${DEST_point}${FOLDERNAME}/"
            else
                eval rsync $OPTIONS "${FOLDER}/" "${DEST_point}${FOLDERNAME}/"
            fi
        fi
    done < $LISTFOLDERS
    # Snapshot auto-rotate
    if [ $SNAPSHOT_GLOBAL = "enable" ]; then
        for ((a=0; a<${#SAR[*]}; a++)); do
            eval "${SAR[$a]}"
        done
    fi
fi

# Generate public/private rsa key pair
ssh_keygen() {
    ssh-keygen -t rsa -b 4096
}

# Copy your public key on a remote machine
ssh_copy_id() {
    # Function for remote host choice
    PS3='Select the remote host: '
    rhchoice() {
        eval set $RHARR
        select RH; {
            REMOTEHOST=$RH
            break
        }
    }

    # Read the list of remote hosts
    while read LINE; do
        IFS=";"
        set -- $LINE
        if [ "$6" != "" ] && [ "$7" != "" ]; then
            RH="${6}@${7}"
            RHARR="$RHARR $RH"
        fi
    done < $LISTFOLDERS

    # Remote host choice
    if [ "$RHARR" != "" ]; then
        rhchoice $RHARR
    else
        echo "No remote hosts, please configure the settings file: $LISTFOLDERS"
    fi

    ID_FILE="${HOME}/.ssh/id_rsa.pub"

    if [ x$SSH_AUTH_SOCK != x ] && ssh-add -L >/dev/null 2>&1; then
        GET_ID="$GET_ID ssh-add -L"
    fi

    if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ]; then
        GET_ID="cat ${ID_FILE}"
    fi

    if [ -z "`eval $GET_ID`" ]; then
        echo "$0: ERROR: No identities found" >&2
        exit 1
    fi

    if [ "$RHARR" != "" ]; then
        { eval "$GET_ID" ; } | ssh ${REMOTEHOST%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1
    fi
}

ME=$(basename "$0")
print_help() {
    echo
    echo "Usage: $ME [OPTION...]"
    echo
    echo "Options:"
    echo "         -g     Generate public/private rsa key pair:"
    echo "                ssh-keygen -t rsa -b 4096"
    echo "         -c     Copy your public key on a remote machine:"
    echo "                ssh-copy-id user@host"
    echo "         -h     Help."
    echo
    echo "Example: $ME -gc"
    echo "Use both options, generate & copy."
    echo
}

while getopts ":gch" opt;
do
    case $opt in
        g) ssh_keygen;
            ;;
        c) ssh_copy_id;
            ;;
        h) print_help;
            ;;
        *) echo "Wrong option";
            echo "For help, use: $ME -h";
            exit 1
            ;;
        esac
done
# -------------------------------------------- end of [Do not touch this section]

» Читать далее »

RDP & RDP over SSH automatic connection script

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

Подключение к удаленному рабочему столу сводится к простому вводу ‘./rdp username’. Имя пользователя можно вводить в любом регистре, пароль и хост удаленной машины автоматически подставляются из простого текстового файла. Скрипт работает из под Mac OS X (OS X) и из под Linux. Для OS X должен быть установлен X Window System (X11). Интерфейс сетевого подключения и внутренний IP адрес так же автоматически определяются в зависимости от операционной системы.

Для примера, подключение к серверу:

1
./rdp root

Процедура подключения:

» Читать далее »

rsync — Automated backup script (with snapshots)

Решил немного упростить задачу резервного копирования при помощи rsync и написал для этого небольшой скрипт на bash. Да, знаю, уже есть несколько решений, упрощающих backup при помощи rsync, но для того, чтобы выполнить требуемую задачу, все равно пришлось бы писать для этого свою обвязку. Потому было принято решение написать что-то свое, максимально упрощающее задачу бэкапа и сопутствующих этому действий, таких как генерация ключа для авторизации по ssh, а так же его копирование на backup-сервер.

Следующий скрипт позволяет читать список копирумых каталогов из текстового файла, применять маску исключений, задаваемую в текстовом файле, а так же опционально делать snapshot’ы, содержащие измененные, либо удаленные файлы. Тем самым, появляется возможность откатиться на старые версии файлов, случайно удаленных, к примеру, либо ошибочно измененных. При этом сохраняется полная изначальная структура каталогов, что позволяет легко найти требуемый файл. Snapshot’ы хранятся в каталогах со следующей маской в имени: ‘год-месяц-день.XXчXXм’. Есть возможность авторотации snapshot’ов.

backup.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/bin/sh

# ———————————————
# Automated backup script
# Written by ZeroChaos
# Version 1.1, 2012-01-14
# Site: http://zerolab.net/
# ———————————————
# NOTE: Exclude spaces in the variable FOLDER!
# ———————————————
# set -e

# ——————————————— begin of [Configurable settings]
# Use SSH for sync
export RSYNC_RSH="ssh -c arcfour -o Compression=no -x"

# Remote account
USER="zerochaos"
HOST="zerolab.net"
REMOTEHOST="${USER}@${HOST}"

# Enable or disable snapshot
SNAPSHOT="true"
# Auto-rotate (days)
SDAYS="15"

# Destination folder, snapshot directory
DEST_point="/home/zerochaos/www/"
SDIR="snapshot"
SNAPSHOT_dir="${DEST_point}${SDIR}/`date +’%Y-%m-%d.%Hh%Mm’`"

# Take the list from the same folder where the script is called
DIR=$(dirname "$0")
LISTFOLDERS=$DIR/backup.txt
LISTEXCLUDES=$DIR/exclude.txt
STRDEL="# begin of [do not delete this string]"
# ——————————————— end of [Configurable settings]

# ——————————————— begin of [Do not touch this section]
# If no arguments
if [ $# = 0 ]; then
    while read FOLDER; do
        if [ -n "$FOLDER" ] && [ "$FOLDER" != "$STRDEL" ]; then
            FOLDERNAME="`echo "$FOLDER" | awk -F/ ‘{ print $NF }’`"
            # Options for rsync
            if [ $SNAPSHOT = "true" ]; then
                OPTIONS="-Sazq —bwlimit=3840 —delete —exclude-from=$LISTEXCLUDES —backup —backup-dir=$SNAPSHOT_dir/$FOLDERNAME"
            else
                OPTIONS="-Sazq —bwlimit=3840 —delete —exclude-from=$LISTEXCLUDES"
            fi
            # Sync
            rsync $OPTIONS "${FOLDER}/" $REMOTEHOST:"${DEST_point}${FOLDERNAME}/"
        fi
    done < $LISTFOLDERS
    # Snapshot auto-rotate
    if [ $SNAPSHOT = "true" ]; then
        ssh $REMOTEHOST "find ${DEST_point}${SDIR}/ -type d -mtime +$SDAYS -exec rm -r {} \;" >/dev/null 2>&1
    fi
fi

# Generate public/private rsa key pair
ssh_keygen() {
    ssh-keygen -t rsa -b 4096
}

# Copy your public key on a remote machine
ssh_copy_id() {
    ID_FILE="${HOME}/.ssh/id_rsa.pub"

    if [ x$SSH_AUTH_SOCK != x ] && ssh-add -L >/dev/null 2>&1; then
      GET_ID="$GET_ID ssh-add -L"
    fi

    if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ]; then
      GET_ID="cat ${ID_FILE}"
    fi

    if [ -z "`eval $GET_ID`" ]; then
      echo "$0: ERROR: No identities found" >&2
      exit 1
    fi

    { eval "$GET_ID" ; } | ssh ${REMOTEHOST%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1
}

ME=$(basename "$0")
print_help() {
    echo
    echo "Usage: $ME [OPTION…]"
    echo
    echo "Options:"
    echo "         -g     Generate public/private rsa key pair:"
    echo "                ssh-keygen -t rsa -b 4096"
    echo "         -c     Copy your public key on a remote machine:"
    echo "                ssh-copy-id $REMOTEHOST"
    echo "         -h     Help."
    echo
    echo "Example: $ME -gc"
    echo "Use both options, generate & copy."
    echo
}

while getopts ":gch" opt;
do
    case $opt in
        g) ssh_keygen;
            ;;
        c) ssh_copy_id;
            ;;
        h) print_help;
            ;;
        *) echo "Wrong option";
            echo "For help, use: $ME -h";
            exit 1
            ;;
        esac
done
# ——————————————— end of [Do not touch this section]

» Читать далее »

fb2toepub for Mac OS X – Drag&Drop converter

fb2toepub

Графический интерфейс для экстремально быстрого консольного конвертера fb2toepub от Алексея Бобкова.

fb2lrf-dmg

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

История изменений:

21.08.2011
— Поддержка OS X Lion

Настройки по умолчанию:

1
2
3
4
5
# begin of [Configurable settings]
Volume="READER"
BooksPATH="database/media/books"
LOGFILE="$HOMEDIR/Library/Logs/fb2toepub.log"
# end of [Configurable settings]

Настраивается в файле ‘fb2toepub.app/Contents/Resources/script’.

Настройку файла стилей нужно производить в папке ‘fb2toepub.app/Contents/Resources/css’, в эту же папку кладутся шрифты для встраивания в конечный ePub (примеры смотреть в архиве с исходниками консольной версии). По умолчанию включен ‘style.css’, настроенный для Sony Reader.

При необходимости, правим параметр ‘Volume’. Это метка тома вашей электронной книги, подключенной к компьютеру.
BooksPATH — путь, куда будут сохранены книги.
LOGFILE — файл, в который будут сохраняться сообщения об ошибках конвертации. При начале новой сессии конвертации, log-файл очищается.

Скачать (обновлено: 21.08.2011, ver. 1.0_4)

fb2lrf for Mac OS X – Drag&Drop converter

fb2lrf

Я всерьез думал, что с основным форматом для чтения на электронных книжках наконец-то определился — PDF. Но время показало, как я был не прав. С покупкой пятидюймовой читалки Sony Reader PRS-350, отсутствие масштабирования стало критичным фактором, что и заставило меня вспомнить о родном формате Sony — LRF. Проблема заключается в том, что под Mac OS X нет вменяемого конвертера в этот формат. Calibre — монструозен и качеством выходного материала не блещет.

Все пользователи Windows прекрасно знакомы с однокнопочным конвертером от Михаила Шаронова, а так же его производной — консольным конвертером. И я подумал, почему бы не прикрутить к нему нативный для Mac OS X GUI, а под капотом пусть работает себе консольный конвертер через Wine.

Задача стояла следующая:

1. Должен получиться автономный bundle, без необходимости устанавливать весь пакет Wine, весящий без малого около 200 МБайт. Т.е. конечное приложение ничем не должно отличаться от родного для Mac OS X.
2. Собрать и урезать Wine настолько, насколько это возможно, оставив только необходимые для работы конвертера библиотеки.

Немного подумав, реализовал задуманное.

fb2lrf-dmg

В результате получился пакет размером всего лишь чуть более 5 МБайт. Работает пакетное конвертирование, паразитные расширения отсекаются. Достаточно в окно конвертера перетянуть файл(ы) или папк(у,и) и получить в том же каталоге результат. По-моему, очень удобно получилось.

Требования: Intel-based Mac, X11

Скачать (обновлено: 14.02.2011)

Первый запуск будет немного продолжительнее последующих, при первом запуске для Wine автоматически будут применены необходимые настройки. Файл стилей ‘default_styles.sini’ вы можете найти и отредактировать внутри bundle — ‘fb2lrf.app/Contents/Resources/lib’.

Особенности редактирования ‘default_styles.sini’: к путям необходимо вначале добавлять: ‘Z:’. Привожу пример того, как встроить пользовательский шрифт в конечный LRF файл:

1
2
3
4
5
6
7
...
FontName=Georgia
...
IsExternalFont=0
...
ExternalFontFile=Z:/Library/Fonts/Georgia.ttf|Georgia|Georgia
...

История изменений:

14.02.2011
— Добавлен вывод информации о том, какая книга в данный момент конвертируется

24.01.2011
— Нет привязки к каталогу ‘Applications’
— Добавлено: если перед началом конвертации Sony Reader подключить к компьютеру, то сконвертированные файлы будут сохранены на устройстве и расфасованы по тем папкам, в которых они находились при подаче на конвертер. Поддерживается любая степень вложенности, файлы будут сохранены по каталогам, без сохранения оной.

Настройки по умолчанию:

1
2
3
4
# begin of [Configurable settings]
Volume="READER"
BooksPATH="database/media/books"
# end of [Configurable settings]

Настраивается в файле ‘fb2lrf.app/Contents/Resources/script’.

Не уверен, что на всех моделях Sony Reader метка тома ‘READER’, поэтому, при необходимости, правим параметр ‘Volume’.
BooksPATH — путь, куда будут сохранены книги. Если у Вас установлен PRS+, то путь может отличаться от того, что стоит по умолчанию. Правим, при необходимости.

fb2pdf for Windows — Drag&Drop converter

По многочисленным просьбам написал GUI под Windows. Стоило это мне установки Windows в виртуальную машину под Mac OS X, инсталляции RAD Studio и пары дней на сам проект.

Интерфейс выполнен в Mac Style и пропитан духом этой операционной системы, копируя при этом выпущенный ранее GUI под Mac OS X. Программа работает по принципу Drag&Drop. Профиль заточен под Sony PRS 500, 505, 600, 650, 700 (& other 6″), кто хочет его поменять, найдет stylesheet.json в папке с программой.

Все необходимое для работы собрано в инсталлятор. Установите и пользуйтесь.

Перетягиваем файл или папку в окно программы и получаем результат.

Скачать (обновлено: 20.04.2011, ver. 20110306)

Стили отдельно, Modified Default Style и для Kindle DX:

Стили

Пользуйтесь на здоровье.

fb2pdf for Mac OS X — Drag&Drop converter


В ожидании доставки своего Kindle DX Graphite, решил прикрутить GUI к замечательной консольной утилите fb2pdf от viktorz.

Все это собрано в один bundle под операционную систему Mac OS X, работает по принципу Drag&Drop. Профиль заточен под Sony PRS 500, 505, 600, 650, 700, кто хочет его поменять, найдет stylesheet.json в ресурсах bundle.

Перетягиваем файл или папку в окно программы и получаем результат:

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

Скачать (обновлено: 20.04.2011, ver. 20110306)

Стили отдельно, Modified Default Style и для Kindle DX:

Стили

Пользуйтесь на здоровье.

Twitter

MSI Lab Twitter
Яндекс.Деньги:

VISA/MasterCard:

PayPal:
PayPal USD
PayPal RUB
WMZ WMZ: Z375880088307
WMR WMR: R883546545943
YAD YAD: 4100170884493

Donate - лучшее спасибо автору
Количество благодарностей: 28

Разделы