Имя: Пароль:
IT
Админ
Создаем принт-сервер "JetDirect" в среде Windows ("общий доступ" дает бесправный)
0 smaharbA
 
22.04.10
22:40
Качаем тут и распаковываем в любую папку
http://www.karat-e.ru/files/lpserver.zip

запускаем пакетный файл lpserver.bat
если запустить без аргументов, то "jetDirect" будет на порту 9100 и печать на принтер по умолчанию.

Параметры командной строки:
lpserver.bat ["Имя принтера как в системе"] [номер порта]

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

Номер порта может быть в десятичном, восьмеричном и шестнадцатиричном формате, к примеру: 9101, 021615 или 0x238D
Восьмеричный начинается с символа 0..., шестнадцатиричный с 0x...

Про netcat для windows читаем тут
http://www.rodneybeede.com/Compile_Netcat_on_Windows_using_MinGW.html

и тут http://joncraton.org/blog/46#disqus_thread

(в последнем антивирус может ругнуться, но там все расписано, если сыкливо то по первой ссылке)


По rawprint читаем тут

http://support.microsoft.com/kb/138594/


Все...
(будет не лениво уйду от нетката и равпринта, пакетник специально для показать то что в пакетниках многое возможно, по сути пакетник может быть всего из 4 строк)
1 Fragster
 
гуру
22.04.10
22:46
(0) а оно по snmp статус отдавать будет?
2 Fragster
 
гуру
22.04.10
22:46
а на пакетниках - и морской бой писали..
3 Asmody
 
22.04.10
22:50
мсье знает толк в извращениях. а может еще и cups под виндой запустить?
4 Fragster
 
гуру
22.04.10
22:50
(3) уто было бы круто. и принтеров 5 в пул объединить...
5 Asmody
 
22.04.10
22:54
(4) делов-то: colinux+mingw+исходники+ много-много свободного времени и желания потрахаться с извращениями
6 Fragster
 
гуру
22.04.10
23:06
(5) лучше бабу
7 Ковычки
 
22.04.10
23:08
неткат позволит и псевдо группировку делать ))
8 Asmody
 
22.04.10
23:11
(6) такие извращения не каждая выдержит
9 Ковычки
 
22.04.10
23:11
сабж очень полезен линуксоидам, в нем ответ на "нерешаемое"
10 DjSpike
 
22.04.10
23:15
(9) и в чем его полезность ?
11 Ковычки
 
22.04.10
23:24
(10) Вы печатали на canon mf 3110 или еще какой panasonic 650 ?
решение в линуксе аналогичное, не требует настроенной системы печати
много бьется лбом о косяки капса и самбы, а ответ ужасно прост
12 Ковычки
 
22.04.10
23:24
и применяется не один год
13 DjSpike
 
22.04.10
23:39
(11) Печатал, только использую другой костыль в видe redmon и gs864. Вот описание http://osdir.com/ml/altlinux.hardware/2005-04/msg00419.html
14 DjSpike
 
22.04.10
23:40
Вот теперь интересно какой из вариантов лучше ???
15 Ковычки
 
23.04.10
00:03
(13) не путай божий дар с яичницей, кстати по этому поводу все еще просче
16 DjSpike
 
23.04.10
08:22
(15) И что из них божий дар а что яишница ???
17 smaharbA
 
23.04.10
09:38
(16) решение в ссылке (13) крайне убогое
все решается либо в бакенд скриптах капса либо аналогией сабжу
18 smaharbA
 
23.04.10
09:39
+(17) и не нужен для этого никакой редмон
19 DjSpike
 
23.04.10
09:55
(18) ладно попробуем, данное решение.  А что в данном случае надо будет прописывать на стороне cups , какой принтер указвать ?
20 smaharbA
 
23.04.10
10:03
(19) на стороне капса как и в (13) прописывается либо постскрипт принтер, либо пдф на схему socket://x.x.x.x:xxxx

в приведенное решение (конечно лучше переписать на wsh) внедряют либо тот же gs либо adobe reader с выводом на печать соответствующим (вместо rawprint)

либо делают вариант с бакенд скриптами капса, создают свою схему типо customprint://... и тут уже гибче, либо вывод на аналогию сабжа, либо на тот же общий доступ через smbclient

В целом, сабж был не как готовое решение, а как пример возможности решения вопроса
21 smaharbA
 
23.04.10
10:04
с бакенд скриптами можно сделать и возможность создания пользователем нужного принтера без прав рута
22 Ковычки
 
26.04.10
22:32
добавлен джихост и печать из постскрипт и пдф
23 smaharbA
 
27.04.10
21:02
Версия дополненная и переработанная

http://www.n-d.ru/images/lpserver.rar

(объем 16 мегабайт)
включает в себя ghostscript, позволяет печатать на socket://адрес:порт
в форматах PostScript, PDF, PCL и RAW

т.е. достаточно установить на клиенте принтер с дривером PostScript, PDF или PCL (для виндуз к примеру HP LaserJet 1200 PCL или любой другой) печатать будет на любой установленный на "сервере" принтер, даже самый виндовозный.

проверено как "сервер печати" на windows XP/2003, как клиент на Mandriva,Windows XP/2003/7

Запуск без параметров найдет свободные порты начиная с 9100 и повешает на них имеющиеся принтеры, первый из свободных портов будет задействован для печати на принтер по умолчанию от чьего имени запущен пакетник

(права на запуск и использование не нужны)
24 DjSpike
 
28.04.10
09:42
(23) Спасибо за данную очень полезную вещь...  Попробовал понравилось больше чем вариант который я озвучивал в (13).     Подскажи а можно сделать так чтобы у пользователя не весело черное окно батника, и чтобы он запускался сразу при запуске системы....  ну т.е. оформить это как службу windows ?
25 smaharbA
 
28.04.10
11:52
(24) дописываю некоторые исправления пакетника
а запускать можно из шедулера от другого пользователя

перепишу на скрипты
и в пакетник и скриптовый вариант включу вывод в очередь печати источник печати и документ (для логирования)
еще дополнение - сделаю "обратную" печать на принтер подключенный к линуксу непосредственно и не имеющий дриверов и бакендов для капса, это просто и сейчас реализуется, но думаю в один флакон загнать

если хватит терпения то сведу батник и скрипт WSH и bash в один файл
26 smaharbA
 
28.04.10
11:54
на скриптах окон конечно не будет (диагностические может и сделаю)
да еще - прикрутить надо и акробат ридер если установлен в системе проверять
27 DjSpike
 
28.04.10
14:42
Ждемс с нетерпением....
28 Ковычки
 
30.04.10
01:04
Версия 0.3, комбинированный пакетный файл, запускаться может и как пакетник и как JavaScript (без окна)
изменены параметры запуска, порядок ключей значения не имеет, если не указывать ключ /all то слушатель будет только для одного принтера
стартовать и стопать можно как в командном режиме так и в джабе.
Подсказка минимальная, ссылок на свободные утили в коде пока нет.

http://www.karat-e.ru/files/lpserver-0.3.zip
29 Ковычки
 
30.04.10
01:07
*.****************************************************************
*.Использование как КОМАНДНОГО ФАЙЛА:
*.lpserver.js.bat ["Имя Принтера"] [Номер Порта TCP]
*.[/start | /stop | /restart | /status] [/all] [/js]
*.[/all] - Использовать для всех принтерах.
*.[/js] - Стартовать как JavaScript.
*.[//b] - Включить тихий режим для JavaScript.
*.[/restart] - Пока не реализовано.
*.****************************************************************
*.Использование как JavaScript:
*.wscript.exe/e:javascript lpserver.js.bat...
*.****************************************************************
*.Если название Принтера включает символы ", то замените их на \'.
*.[/en | /ru] - Язык помощи. Без указания - язык системы.
*.****************************************************************
30 DjSpike
 
30.04.10
08:26
файл по ссылке что-то не скачивается.
31 smaharbA
 
30.04.10
10:30
Не ту ссылку указал ))
http://www.n-d.ru/files/lpserver-0.3.zip

некоторое причесывание кода, возможность использовать в ключах как / так и -

http://www.n-d.ru/images/lpserver-0.3.1.rar
32 smaharbA
 
30.04.10
10:33
снава не совсе то ))
так правильно !

http://www.n-d.ru/images/lpserver-0.3.rar
http://www.n-d.ru/images/lpserver-0.3.1.rar
33 smaharbA
 
30.04.10
10:34
Отображение в диспетчере печати реальных данных кто и что печатает еще не реализовано
34 ildary
 
30.04.10
11:06
(33) появится в будущих версиях?
35 smaharbA
 
30.04.10
11:13
обязательно
36 smaharbA
 
30.04.10
11:14
хотя пока даже метод restart не реализован )))
37 smaharbA
 
30.04.10
11:33
устранена досадная ошибка в последней версии, не верно определял тип выходного потока т.е. PS,PDF,PCL или RAW ((
38 smaharbA
 
14.05.10
16:48
издание четвертое дополненное и переработанное

http://www.n-d.ru/images/lpserver-0.4.7.rar

- исправлена досадная ошибка в таблице символов
- сделано автоопределение utf8 кодировки в полях комментариев
- изменена работа :unescape, декодирует как cp1251 так и utf8
- сделано "обрезание" файла, для определения параметров не по всему файлу
- код пакетной части подробно комментирован, и может быть выведен новым ключем /rem
- добавлена работа с .XPS
- изменено определение типов файлов
- добавлено логирование печати, виндуз для большинства дриверов логирует и имя и название документа
- много повторяющегося кода вынесено в "процедуры" (метки), создан интересный механизм возврата значений из "процедур"

для линук без изменений в ОС будет логирование только удаленного адреса
если нужно сделать полное логирование надо добавить в
/usr/lib/cups/backend

примерно такой скрипт с именем socket.sh (есть в архиве)
(URI принтера надо поменять с socket://x.x.x.x:91xx на socket.sh://x.x.x.x:91xx)

#!/bin/sh

LANG=ru_RU.UTF-8
tocode=utf-8

function recodes() {
   LANG=ru_RU.UTF-8
   iconv -t $tocode | od -A n -w1024 -t x1 - | tr 'a-z' 'A-Z' | tr -d ' \t'
   }

backend=/usr/lib/cups/backend/`basename "$0" .sh`
pspool=/var/spool/cups/tmp
spool=$pspool/`basename "$0" .sh`.$RANDOM.spool

if [ ! -d "$pspool" ]; then
   mkdir -p "$pspool" 2> /dev/null
fi

cat >> "$spool"

DEVICE_URI=`basename "$0" .sh`:${DEVICE_URI#*:}
type=`file -ib $spool`
title=`echo -n $3 | recodes ../qp | sed 's/ =/=20=/g; s/=//g' | tr -d '\n'`
user=`echo -n $2 | recodes ../qp | sed 's/ =/=20=/g; s/=//g' | tr -d '\n'`
if [ "${type%;*}" = "application/postscript" ]; then

   sed 's/^%!PS-Adobe-3.0/%!PS-Adobe-3.0\n%%For: <'"$user"'>\n%%Title: <'"$title"'>\n/g' "$spool" | `which ps2pdf` - - > $spool.pdf
   sed 's/^%!PS-Adobe.*/%!PS-Adobe-3.0\n%%For: <'"$user"'>\n%%Title: <'"$title"'>\n/g' "$spool" | "$backend" "$@"
   ret=$?
elif [ "${type%;*}" = "application/pdf" ]; then
   sed 's/^%PDF.*/%PDF-1.4\n%%For: <'"$user"'>\n%%Title: <'"$title"'>/g' "$spool" | "$backend" "$@"
elif [ "${type%;*}" = "application/octet-stream" ]; then
   (
   echo -e '\x1b%-12345X@PJL'
   echo @PJL COMMENT "\"Username: <$user>; Filename: <$title>; `date +%d.%m.%Y`\""
   cat "$spool"
   ) | "$backend" "$@"
   ret=$?
else
   "$backend" "$@" < "$spool"
   ret=$?
fi
rm -f "$spool"
exit $ret


(в общем - пишите письма)
39 smaharbA
 
14.05.10
16:54
будет дополнено ответом на запросы клиента при нахождении принтеров JetDirect
так же ждет реализации двусторонний обмен, для получения всяких параметров, типа остатка тонера/чернил и прочего, отправки тестовой страницы принтера (не тестовой страницы системы печати)

из линукса есть проблема печати документов содержащих разные размеры страниц
40 Ковычки
 
18.05.10
22:38
сделана "обратная печать", для печати на непосредственно подключенный к машмне принтер через "принтсервер" в сети, без наличия дриверов на машинке (ранне такое делалось, но ручками)
пешите письма
41 DjSpike
 
18.05.10
23:17
Эх... очередное огромное спасибо.  На днях попробую.
42 Ковычки
 
18.05.10
23:18
"обратная печать" пока не выложена
43 Ковычки
 
20.05.10
20:37
плюсом написан простенький скрипт эмулирующий JetDirect в линуксе/бсд (на бсд еще не проверил)
возможно обходиться и без этого скрипта просто "шведским ножом" или ncat из пакета nmap или просто в inetd/xinet.d
но сделано для универсальности, на сколько возможно максимум не использовано внешних утилит (скрипт составной шел и перл, будем еще упрощать не теряя универсальности)


#!/bin/sh
#
# lpserver     This starts, stops, and restart the lpserver
#              emulate HP Jet Direct
#
# chkconfig: 2345 45 10
# description: emulate HP Jet Direct
#

PATH=/sbin:/usr/sbin:$PATH
RETVAL=0
prog=`basename $0`
#
# prog = {netcat|nc|ncat|this script}
#
name=`basename $0`
devices=`find /dev -name "lp*" -type c | sort`
devices="/tmp/lp0 /tmp/lp1"
port=9099
maxlist=100
maxport=$((port + maxlist))
command=$prog
if [ "$prog" = "$name" -a -n "`grep '^#!/usr/bin/perl' "$0"`" ]; then
   command="perl -x $prog"
fi
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"
[ -z "${COLUMNS:-}" ] && COLUMNS=`stty -a 2>/dev/null | sed -n 's/.*columns \([0-9]*\);.*/\1/p'`
[ -z "${COLUMNS:-}" ] && COLUMNS=80
RES_COL=$((COLUMNS - 15))
MOVE_TO_COL="echo -en \\033[${RES_COL}G"

success() {
   echo -n "$@"
   $MOVE_TO_COL
   $SETCOLOR_SUCCESS
   echo '[  OK  ]'
   $SETCOLOR_NORMAL
   }

failure() {
   echo -n "$@"
   $MOVE_TO_COL
   $SETCOLOR_FAILURE
   echo '[ ERRO ]'
   $SETCOLOR_NORMAL
   }

usage(){
   echo "Usage: service $prog {start|stop|restart|status}"
   RETVAL=2
   return $RETVAL
   }

status() {
   RETVAL=1
   pid=`ps ax -o pid= -o command= | grep "$command" | grep -v "^$$\|grep" | awk '{ print $1 }'`
   pid=`ps -o pid= -p $pid 2> /dev/null`
   if [ -n "$pid" ]; then
       echo "$prog is running (`echo $pid`)..."
       RETVAL=0
   else
       echo "$prog is not running..."
   fi
   return $RETVAL
   }

start(){
   RETVAL=1
   status
   if [ $? -eq 0 ]; then
       echo "Process alredy is running..."
       return $RETVAL
   fi
   n=-1
   pid=""
   echo -n "Starting: "
   for device in $devices; do
       (cat /dev/null > $device) 2> /dev/null || continue
       while [ $? -eq 0 -a $port -lt $maxport  ]; do
           port=$((port + 1))
           netstat -a -n | grep -q "^tcp.*[\.:]$port.*LISTEN"
       done
       if [ $port -lt $maxport ]; then
           $command -v -n -l $port -k > $device 2> /dev/null &
           pid="$pid$! "
           sleep 1
       fi
   done
   if [ -n "$pid" ]; then
       success "$prog is started (`echo $pid`)..."
       RETVAL=0
   else
       failure "$prog not started..."
   fi
   return $RETVAL
   }

stop(){
   status || return $RETVAL
   echo -n "Stopping: "
   pid=`ps ax -o pid= -o command= | grep "$command" | grep -v "^$$\|grep" | awk '{ print $1 }'`
   pid=`ps -o pid= -p $pid 2> /dev/null`
   kpid=""
   for cpid in $pid; do
       kill -9 $cpid && kpid="$kpid$cpid "
   done
   if [ -n "$kpid" ]; then
       success "$prog is stopped (`echo $kpid`)..."
       RETVAL=0
   else
       failure "$prog not stopped (`echo $pid`)..."
       RETVAL=1
   fi
   return $RETVAL
   }

restart(){
   stop
   start
   }

case "$1" in
   start) start ;;
   stop) stop ;;
   status) status ;;
   restart) restart ;;
   *) usage ;;
esac

exit $RETVAL

#!/usr/bin/perl
# lpserver.pl
#--------------------

use strict;
use Socket;
use IO::Handle;
$|=1;
my $scriptname=(split("\/",$0))[-1];

my $port=0;
my ($list,$keep,$verb)=(grep(/^-l$/i,@ARGV),grep(/^-k$/i,@ARGV),grep(/^-v$/i,@ARGV));

if ($list eq "") {
   print "Usage: ./$scriptname -l [TCP port] [-k] [-v]\n-k kepp connection;\n-v verbose.\n";
   exit;
   }
while ($port = shift) {
   last if (0 + $port ne 0);
   }
$port = 0 + $port eq 0 ? 9100 : abs($port);

$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = $SIG{TSTP} = $SIG{STOP} = \&interrupt;;

my $proto = getprotobyname('tcp');

socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "Can't open socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR $!\n";

my $addr = sockaddr_in($port, INADDR_ANY);
bind( SOCKET, $addr) or die "Can't bind to port $port!\n";
listen(SOCKET, 20) or die "listen: $!\n";
print STDERR "SERVER started on port $port\n";

my $maxlen=256;
my $flags=0;
my $byte;
my $c_port;
my $c_ip;
my $ip;

my $c_addr;
while ($c_addr = accept(C_SOCKET, SOCKET)) {
   ($c_port,$c_ip)=sockaddr_in($c_addr);
   $ip = inet_ntoa($c_ip);
   print STDERR "Client connected from $ip\n" if ($verb ne 0);
   C_SOCKET->autoflush(1);
   $byte=".";
   while ($byte ne ""){
       recv(C_SOCKET,$byte,$maxlen,$flags);# or die "Can't receive: $!\n";
       print STDOUT "$byte";
       }
   print STDOUT "\x1a\n";
   close C_SOCKET;
   last if ($keep eq 0);
   }
close SOCKET;
exit;

sub interrupt {
   print STDERR "\nInterrupt $scriptname...\n";
   close SOCKET;
   exit;
   }
44 Ковычки
 
20.05.10
21:08
да строчка
devices="/tmp/lp0 /tmp/lp1"
лишняя, была для тестирования