четверг, 10 декабря 2009 г.

Репозиторий с собранной бакулой для CentOS

[pp-contrib]
name=PPs packages for Red Hat Enterprise Linux 5 - contrib
baseurl=ftp://ftp.pramberger.at/systems/linux/contrib/rhel5/$basearch/
gpgcheck=1
gpgkey=ftp://ftp.pramberger.at/systems/linux/contrib/rhel5/RPM-GPG-KEY-6971f6ac
enabled=1
priority=30

[pp-contrib-debug]
name=PPs packages for Red Hat Enterprise Linux 5 - debug
baseurl=ftp://ftp.pramberger.at/systems/linux/contrib/rhel5/$basearch/debug/
gpgcheck=1
gpgkey=ftp://ftp.pramberger.at/systems/linux/contrib/rhel5/RPM-GPG-KEY-6971f6ac
enabled=0
priority=30

[pp-contrib-source]
name=PPs packages for Red Hat Enterprise Linux 5 - source
baseurl=ftp://ftp.pramberger.at/systems/linux/contrib/rhel5/SRPMS/
gpgcheck=1
gpgkey=ftp://ftp.pramberger.at/systems/linux/contrib/rhel5/RPM-GPG-KEY-6971f6ac
enabled=0
priority=30

Bacula, шаблон для вставки в конфиг стораж демона

Device {
 Name = @compname@-FileStorage
 Device Type = File
 Media Type = @compname@-File
 Archive Device = /bacula/devices/@compname@
 Random Access = Yes
 AutomaticMount = yes
 RemovableMedia = no
 AlwaysOpen = no
 LabelMedia = yes
}

Bacula, шаблон для вставки в конфиг директора

# @compname@ dir
# Client (File Services) to backup
Job {
 Name = "@compname@-job"
 JobDefs = "DefaultJob2"
 Write Bootstrap = "/var/lib/bacula/@compname@.bsr"
 Client = @compname@-fd
 FileSet = "@compname@-FileSet"
 Storage = "@compname@-FileStorage"
 ClientRunBeforeJob = "\"E:/Documents and Settings/All Users/Application Data/Bacula/runbefore.bat\""
 ClientRunAfterJob = "\"E:/Documents and Settings/All Users/Application Data/Bacula/runafter.bat\""
}

Client {
 Name = @compname@-fd
 Maximum Concurrent Jobs = 20
 Address = @compname@.local
 FDPort = 9102
 Catalog = MyCatalog
 Password = "passworrd"          # password for FileDaemon
 File Retention = 60 days            # 30 days
 Job Retention = 6 months            # six months
 AutoPrune = yes                     # Prune expired Jobs/Files
}

# List of files to be backed up
FileSet {
 Name = "@compname@-FileSet"
 Enable VSS = yes
 Include {
   Options {
     signature = MD5
     compression = GZIP
     IgnoreCase = yes
     Exclude = yes
     WildDir = "[A-Z]:/temp"
     WildFile = "*.tmp"
     WildDir = "[A-Z]:/RECYCLER"
     WildFile = "[A-Z]:/pagefile.sys"
     WildFile = "[A-Z]:/Documents and Settings/*/LocalSettings/Application Data/Microsoft/Windows/usrclass.*"
     WildFile = "[A-Z]:/Documents and Settings/*/ntuser.*"
     WildDir = "[A-Z]:/Documents and Settings/*/Cookies"
     WildDir = "[A-Z]:/Documents and Settings/*/Recent"
     WildDir = "[A-Z]:/Documents and Settings/*/LocalSettings/History"
     WildDir = "[A-Z]:/Documents and Settings/*/LocalSettings/Temp"
     WildDir = "[A-Z]:/Documents and Settings/*/LocalSettings/Temporary Internet Files"
     # These are always open and unable to be backed up
     WildFile = "[A-Z]:/Documents and Settings/All Users/ApplicationData/Microsoft/Network/Downloader/qmgr[01].dat"
     WildFile = "*.mp1"
     WildFile = "*.mp2"
     WildFile = "*.mp3"
     WildFile = "*.avi"
     WildFile = "*.mpg"
     WildFile = "*.mpeg"
     WildFile = "*.ogg"
   }
   File = C:/SystemStateBackup.bkf
   File = E:/

 }
 Exclude {
 }
}

# Definition of file storage device
Storage {
 Name = @compname@-FileStorage
 Maximum Concurrent Jobs = 1
 Address = at0038.local                # N.B. Use a fully qualified name here
 SDPort = 9103
 Password = "passworrd"
 Device = @compname@-FileStorage
 Media Type = @compname@-File
}

Bacula, конфиг файд демона

Director {
 Name = at0038-dir
 Password = "passworrd"
}

Director {
 Name = at0038-mon
 Password = "passworrd"
 Monitor = yes
}

FileDaemon {                          # this is me
 Name = at0038-fd
 FDport = 9102                  # where we listen for the director
 WorkingDirectory = /var/lib/bacula
 Pid Directory = /var/run
 Maximum Concurrent Jobs = 100
}

Messages {
 Name = Standard
 director = at0038-dir = all, !skipped, !restored
}

Bacula, конфиг стораждемона

Storage {                             # definition of myself
 Name = at0038-sd
 SDPort = 9103
 WorkingDirectory = "/var/lib/bacula"
 Pid Directory = "/var/run"
 Maximum Concurrent Jobs = 20
}

Director {
 Name = at0038-dir
 Password = "passworrd"
}

Director {
 Name = at0038-mon
 Password = "passworrd"
 Monitor = yes
}

Device {
 Name = FileStorage
 Media Type = File
 Archive Device = /bacula/devices/default
 LabelMedia = yes
 Random Access = Yes
 AutomaticMount = yes
 RemovableMedia = no
 AlwaysOpen = no
}

Messages {
 Name = Standard
 director = at0038-dir = all
}

@/etc/bacula/conf.d/at0036-sd.conf
@/etc/bacula/conf.d/at0038-sd.conf
@/etc/bacula/conf.d/at0089-sd.conf
@/etc/bacula/conf.d/at-inf-sd.conf
@/etc/bacula/conf.d/at-main-sd.conf
@/etc/bacula/conf.d/at-tkp-sd.conf
@/etc/bacula/conf.d/at-stack1-sd.conf
@/etc/bacula/conf.d/atrec-sd.conf
@/etc/bacula/conf.d/vm-av-sd.conf
@/etc/bacula/conf.d/vm-bc-sd.conf
@/etc/bacula/conf.d/vm-dc-sd.conf
@/etc/bacula/conf.d/vm-fs-sd.conf
@/etc/bacula/conf.d/vm-ftp-sd.conf
@/etc/bacula/conf.d/vm-netpromoter-sd.conf
@/etc/bacula/conf.d/vm-netxms-sd.conf
@/etc/bacula/conf.d/vm-ns1-sd.conf
@/etc/bacula/conf.d/vm-ora-sd.conf
@/etc/bacula/conf.d/vm-proxy-sd.conf
@/etc/bacula/conf.d/vm-ras-sd.conf
@/etc/bacula/conf.d/vm-rt-sd.conf
@/etc/bacula/conf.d/vm-site-sd.conf
@/etc/bacula/conf.d/vm-smtp-sd.conf
@/etc/bacula/conf.d/vm-syslog-sd.conf
@/etc/bacula/conf.d/vm-ts-sd.conf
@/etc/bacula/conf.d/vm-ts2-sd.conf
@/etc/bacula/conf.d/vm-wsus-sd.conf
@/etc/bacula/conf.d/vm-www4-sd.conf
@/etc/bacula/conf.d/vm-www5-sd.conf

Bacula, конфиг директора

Director {
 Name = at0038-dir
 DIRport = 9101
 QueryFile = "/etc/bacula/scripts/query.sql"
 WorkingDirectory = "/var/lib/bacula"
 PidDirectory = "/var/run"
 Maximum Concurrent Jobs = 20
 Password = "passworrd"
 Messages = Daemon
}

Console {
 Name = at0038-mon
 Password = "passworrd"
 CommandACL = status, .status
}

# Generic catalog service
Catalog {
 Name = MyCatalog
 dbname = "bacula"; dbuser = "bacula"; dbpassword = "passworrd"
}

JobDefs {
 Name = "DefaultJob"
 Maximum Concurrent Jobs = 20
 Type = Backup
 Level = Incremental
 Schedule = "WeeklyCycle"
 Messages = Standard
 Pool = Default
 Priority = 10
}

JobDefs {
 Name = "DefaultJob2"
 Maximum Concurrent Jobs = 20
 Type = Backup
 Level = Incremental
 Schedule = "WeeklyCycle2"
 Messages = Standard
 Pool = inc-pool
 Priority = 10
}

JobDefs {
 Name = "DefaultJob3"
 Maximum Concurrent Jobs = 20
 Type = Backup
 Level = Incremental
 Schedule = "WeeklyCycle3"
 Messages = Standard
 Pool = inc-pool
 Priority = 10
}

Job {
 Name = "RestoreFiles"
 Type = Restore
 Client= at0038-fd
 FileSet="at0038-FileSet"
 Storage = FileStorage
 Pool = Default
 Messages = Standard
 Where = /bacula/restores
 Priority = 11
 Maximum Concurrent Jobs = 20
}

Schedule {
 Name = "WeeklyCycle"
 Run = FullPool=fullbackup-pool Level=Full Pool=fullbackup-pool 1st fri at 23:05
 Run = DifferentialPool=diffbackup-pool Level=Differential Pool=diffbackup-pool 2nd-5th fri at 23:05
 Run = IncrementalPool=incbackup-pool Level=Incremental Pool=incbackup-pool sat,sun,mon,tue,wed,thu at 23:05
}

Schedule {
 Name = "WeeklyCycle2"
 Run = FullPool=full-pool Level=Full Pool=full-pool 1st fri at 23:05
 Run = DifferentialPool=diff-pool Level=Differential Pool=diff-pool 2nd-5th fri at 23:05
 Run = IncrementalPool=inc-pool Level=Incremental Pool=inc-pool sat,sun,mon,tue,wed,thu at 23:05
}

Schedule {
 Name = "WeeklyCycle3"
 Run = FullPool=full-pool Level=Full Pool=full-pool 1st fri at 21:05
 Run = DifferentialPool=diff-pool Level=Differential Pool=diff-pool 2nd-5th fri at 21:05
 Run = IncrementalPool=inc-pool Level=Incremental Pool=inc-pool sat,sun,mon,tue,wed,thu at 21:05
}

Schedule {
 Name = "WeeklyCycleAfterBackup"
 Run = Full sun-sat at 23:10
}

Storage {
 Name = FileStorage
 Maximum Concurrent Jobs = 1
 Address = at0038.local
 SDPort = 9103
 Password = "passworrd"
 Device = FileStorage
 Media Type = File
}

Messages {
 Name = Standard
 operatorcommand = "/usr/bin/bsmtp -h localhost -f bacula@at0038.local -s \"Bacula: Intervention needed for %j\" %r"
 mailcommand = "/usr/bin/bsmtp -8 -h localhost -f bacula@at0038.local -r it@mydomain.local -s \"%c %n %l %t: %e\" %r"
 mail = logwatch@mydomain.local = all, !skipped
 operator = logwatch@mydomain.local = mount
 console = all, !skipped, !saved
 append = "/var/log/bacula/bacula.log" = all, !skipped
}

Messages {
 Name = Daemon
 mailcommand = "/usr/bin/bsmtp -h localhost -f bacula@at0038.local -s \"Bacula daemon message\" %r"
 mail = logwatch@mydomain.local = all, !skipped
 console = all, !skipped, !saved
 append = "/var/log/bacula/bacula.log" = all, !skipped
}

Pool {
 Name = Default
 Pool Type = Backup
 Recycle = yes                       # Bacula can automatically recycle Volumes
 AutoPrune = yes                     # Prune expired volumes
 Volume Retention = 365 days         # one year
 Label Format = "default-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}"
}

Pool {
 Name = Scratch
 Pool Type = Backup
}

Pool {
   Name = fullbackup-pool
   Pool Type = Backup
   Volume Retention = 200 days
   AutoPrune = yes
   Label Format = "fullbackup-${Job}-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
   Use Volume Once = Yes
}

Pool {
   Name = diffbackup-pool
   Pool Type = Backup
   Volume Retention = 28 days
   AutoPrune = yes
   Label Format = "diffbackup-${Job}-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
}

Pool {
   Name = incbackup-pool
   Pool Type = Backup
   Volume Use Duration = 6 days
   Volume Retention = 7 days
   AutoPrune = yes
   Label Format = "incbackup-${Job}-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
}

Pool {
   Name = full-pool
   Pool Type = Backup
   Volume Retention = 200 days
   AutoPrune = yes
   Label Format = "${Job}-full-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
   Use Volume Once = Yes
}

Pool {
   Name = diff-pool
   Pool Type = Backup
   Volume Retention = 28 days
   AutoPrune = yes
   Label Format = "${Job}-diff-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
   Use Volume Once = Yes
}

Pool {
   Name = inc-pool
   Pool Type = Backup
   Volume Use Duration = 6 days
   Volume Retention = 7 days
   AutoPrune = yes
   Label Format = "${Job}-inc-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
   Use Volume Once = Yes
}

@/etc/bacula/conf.d/at0036-dir.conf
@/etc/bacula/conf.d/at0038-dir.conf
@/etc/bacula/conf.d/at0089-dir.conf
@/etc/bacula/conf.d/at-inf-dir.conf
@/etc/bacula/conf.d/at-main-dir.conf
@/etc/bacula/conf.d/atrec-dir.conf
@/etc/bacula/conf.d/at-stack1-dir.conf
# @/etc/bacula/conf.d/at-tkp-dir.conf
@/etc/bacula/conf.d/vm-av-dir.conf
@/etc/bacula/conf.d/vm-bc-dir.conf
@/etc/bacula/conf.d/vm-dc-dir.conf
@/etc/bacula/conf.d/vm-fs-dir.conf
@/etc/bacula/conf.d/vm-ftp-dir.conf
# @/etc/bacula/conf.d/vm-netpromoter-dir.conf
# @/etc/bacula/conf.d/vm-netxms-dir.conf
@/etc/bacula/conf.d/vm-ns1-dir.conf
@/etc/bacula/conf.d/vm-ora-dir.conf
@/etc/bacula/conf.d/vm-proxy-dir.conf
@/etc/bacula/conf.d/vm-ras-dir.conf
@/etc/bacula/conf.d/vm-rt-dir.conf
@/etc/bacula/conf.d/vm-site-dir.conf
@/etc/bacula/conf.d/vm-smtp-dir.conf
@/etc/bacula/conf.d/vm-syslog-dir.conf
@/etc/bacula/conf.d/vm-ts-dir.conf
@/etc/bacula/conf.d/vm-ts2-dir.conf
@/etc/bacula/conf.d/vm-wsus-dir.conf
@/etc/bacula/conf.d/vm-www4-dir.conf
@/etc/bacula/conf.d/vm-www5-dir.conf

четверг, 8 октября 2009 г.

Удаляем старые резервные копии

Смысл: Скопились файлы с резервными копиями, информация о которых отсутсвует в каталоге Baculы. Надо бы от них избавиться.
Что делать? Надо узнать если информация в каталоге бакулы по каждому файлу в папках устройств.
Скрипт:
#!/bin/bash
devicesdir=/bacula/devices
medianame=''
result=''
mysql_host="localhost"
mysql_db="bacula"
mysql_user="bacula"
mysql_password=""

for myfile in $devicesdir/*/*
do
medianame=`echo "$myfile" | cut -d'/' -f5`
result=`echo "select VolumeName FROM Media WHERE VolumeName=\"$medianame\";" | mysql -h $mysql_host -u $mysql_user -p$mysql_password $mysql_db`
if [ "$result" = "" ]
then
rm -fv $myfile
fi
done

В итоге скрипт удалит все файлы, информация о которых не нашлась в каталоге.

Использовать крайне осторожно! Можно лишиться своих резервных копий.

вторник, 21 июля 2009 г.

Автомобильная аптечка

1. Обезболивающие, противовоспалительные и противо шоковые средства при травме (ушибы, переломы, вывихи), ранениях, шоке.
1.1. Анальгин 0,5 № 10 (или аналог) 1 уп.
аспирин 0,5 № 10 1 уп.
1.2. Портативный гипотермический (охлаждающий) пакет-контейнер 1 шт.
1.3. Раствор сульфацила натрия 1 фл.

2. Средства для остановки кровотечения, обработки и перевязки ран.
2.1. Жгут для остановки артериального кровотечения с дозированной компрессией (сдавливанием) для само- и взаимопомощи 1 шт.
2.2. Бинт стерильный 10Ч5 1 шт.
2.3. Бинт нестерильный 10Ч5 1 шт.
2.4. Бинт нестерильный 5Ч5 1 шт.
2.5. Атравматическая повязка МАГ с диоксидином или нитратом серебра 8Ч10 для перевязки грязных ран 1 шт.
2.6. Лейкопластырь бактерицидный 2,5Ч7,2 или 2Ч5 8 шт.
2.7. Салфетки стерильные для остановки капиллярного и венозного кровотечения «Колетекс ГЕМ» с фурагином 6Ч10 см, 10Ч18 см 3 шт. или Статин (порошок) 1,0 гр 3 уп.
2.8. Раствор йода спиртовой 5% или бриллиантовой зелени 1% 1 фл.
2.9. Лейкопластырь 1Ч500 или 2Ч500 или 1Ч250 1 шт.
2.10. Бинт эластичный трубчатый медицинский нестерильный № 1, 3, 6 по 1 шт
2.11. Вата 50 г 1 шт.

3. Средства при болях в сердце.
3.1. Нитроглицерин таб. № 40 или капс. № 20 (тринитролонг) 1 уп.
3.2. Валидол таб. или капс. 1 уп.

4. Средства для сердечно-легочной реанимации при клинической смерти.
4.1. Устройство для проведения искусственного дыхания «Рот-в-рот» 1 шт.

5. Средство при обмороке (коллапсе).
5.1. Аммиака раствор (нашатырный спирт) 1 фл.

6. Средство для дезинтоксикации при отравлениях пищей и т.д.
6.1. Энтеродеа 2 уп.
или уголь активированный в табл. № 10 1 уп.

7. Средство при стрессовых реакциях.
7.1. Корвалол 1 фл.

8. Ножницы тупоконечные 1 шт.

9. Инструкция

10. Футляр пластмассовый

понедельник, 6 апреля 2009 г.

Правим UDEV для DV камеры

В файле /lib/udev/rules.d/50-udev-default.rules

Правим:
# KERNEL=="dv1394[0-9]*", NAME="dv1394/%n", GROUP="video"
KERNEL=="video1394[0-9]*", NAME="video1394/%n", GROUP="video"
KERNEL=="dv1394*", GROUP="video"
KERNEL=="raw1394", GROUP="plugdev"

среда, 1 апреля 2009 г.

Установка bacula

Журнал, backup сервер, установка и настройка
hostname нашего сервера: at0038

У меня контроллер на 8 дисков, по 500 гБ каждый
Делаем два RAID массива, system - 60 GB, data - 2700 GB
Это необходимо, из-за того, что CentOS не может установиться на раздел больше чем 2 ТБ.
sda1 - 10 gb / (корневой раздел оставляем не на ЛВМ)
sda2 - 50 gb pv
sdb1 - 2,6 tb pv
vg0 - /dev/sda2 (Один волумгруп для системных разделов)
vg1 - /dev/sdb1 (один волум групп для данных)
vg0/lv_swap - 2 gb - swap
vg0/lv_var - 10 gb - /var
vg0/lv_tmp - 10 gb - /tmp
vg0/lv_usr - 10 gb - /usr
vg1/lv_bacula - 2,6 tb - /bacula

Centos 5.2 - Установка поумолчанию.
Обновляемся после установки.

Качаем свежую сборку bacula rpms-contrib-fschwarz
Устанавливаем:
качаем ключ: wget http://freefr.dl.sourceforge.net/sourceforge/bacula/fschwarz.asc
устанавливаем ключ: rpm --import fschwarz.asc
yum --nogpgcheck install bacula-mysql-2.4.2-1.el5.i386.rpm bacula-bat-2.4.2-1.el5.i386.rpm bacula-gconsole-2.4.2-1.el5.i386.rpm
правим /etc/aliases:
root: тут адрес на который должны приходить инормационные письма
# newaliases
# /etc/init.d/sendmail restart
Настройка Bacula

Читать:
http://www.opennet.ru/soft/Short_Doc_Bacula.pdf
http://santa-claus-rpm.livejournal.com/5066.html
http://www.opennet.ru/soft/Bacula_PDC_backup.pdf
http://wiki.bacula.org/doku.php
http://www.bog.pp.ru/work/bacula.html

В папке /bacula/devices - создаю папки для каждого клиента, каждая папка устройство (device), бакула не может писать два задания на одно устройство одновременно, если хотим чтобы копирование происходило с нескольких клиентов одновременно, тогда нужно создать несколько устройств.

Конфигурационные файлы:

bacula-dir.conf:

Director {
Name = at0038-dir
DIRport = 9101
QueryFile = "/usr/lib/bacula/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 10
Password = "12345"
Messages = Daemon
}

Console {
Name = at0038-mon
Password = "12345"
CommandACL = status, .status
}

# Generic catalog service
Catalog {
Name = MyCatalog
dbname = "bacula"; dbuser = "bacula"; dbpassword = ""
}

JobDefs {
Name = "DefaultJob"
Maximum Concurrent Jobs = 20
Type = Backup
Level = Incremental
Schedule = "WeeklyCycle"
Messages = Standard
Pool = Default
Priority = 10

}

Job {
Name = "RestoreFiles"
Type = Restore
Client= at0038-fd
FileSet="at0038-FileSet"
Storage = FileStorage
Pool = Default
Messages = Standard
Where = /bacula/restores
Priority = 11
Maximum Concurrent Jobs = 100
}

Schedule {
Name = "WeeklyCycle"
Run = FullPool=fullbackup-pool Level=Full Pool=fullbackup-pool 1st fri at 23:05
Run = DifferentialPool=diffbackup-pool Level=Differential Pool=diffbackup-pool 2nd-5th fri at 23:05
Run = IncrementalPool=incbackup-pool Level=Incremental Pool=incbackup-pool sat,sun,mon,tue,wed,thu at 23:05
}

Schedule {
Name = "WeeklyCycleAfterBackup"
Run = Full sun-sat at 23:10
}

Storage {
Name = FileStorage
Maximum Concurrent Jobs = 1
Address = at0038
SDPort = 9103
Password = "12345"
Device = FileStorage
Media Type = File
}


Messages {
Name = Standard
operatorcommand = "/usr/sbin/bsmtp -h localhost -f bacula@at0038 -s \"Bacula: Intervention needed for %j\" %r"
mailcommand = "/usr/sbin/bsmtp -8 -h localhost -f bacula@at0038 -s \"%c %n %l %t: %e\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}

Messages {
Name = Daemon
mailcommand = "/usr/sbin/bsmtp -h localhost -f bacula@at0038 -s \"Bacula daemon message\" %r"
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}

Pool {
Name = Default
Pool Type = Backup
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 365 days # one year
Label Format = "default-${Job}-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}"
}

Pool {
Name = Scratch
Pool Type = Backup
}

Pool {
Name = fullbackup-pool
Pool Type = Backup
Volume Retention = 200 days
AutoPrune = yes
RecyclePool = Scratch
Recycle = yes
Recycle Oldest Volume = yes
Label Format = "fullbackup-${Job}-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
Use Volume Once = Yes
}

Pool {
Name = diffbackup-pool
Pool Type = Backup
Volume Retention = 40 days
AutoPrune = yes
RecyclePool = Scratch
Recycle = yes
Recycle Oldest Volume = yes
Label Format = "diffbackup-${Job}-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
Use Volume Once = Yes
}

Pool {
Name = incbackup-pool
Pool Type = Backup
Volume Use Duration = 7 days
Volume Retention = 8 days
AutoPrune = yes
RecyclePool = Scratch
Recycle = yes
Recycle Oldest Volume = yes
Label Format = "incbackup-${Job}-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
Use Volume Once = Yes
}

@/etc/bacula/conf.d/шаблон для каждого клиента компьютера (имякомпьютера-dir.conf)

bacula-sd.conf:

Storage { # definition of myself
Name = at0038-sd
SDPort = 9103
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run"
Maximum Concurrent Jobs = 20
}

Director {
Name = at0038-dir
Password = "12345"
}

Director {
Name = at0038-mon
Password = "12345"
Monitor = yes
}

Device {
Name = FileStorage
Media Type = File
Archive Device = /bacula/devices/default
LabelMedia = yes
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
}

Messages {
Name = Standard
director = at0038-dir = all
}

@/etc/bacula/conf.d/шаблон для каждого клиента компьютера (имякомпьютера-sd.conf)

bacula-fd.conf:

Director {
Name = at0038-dir
Password = "12345"
}

Director {
Name = at0038-mon
Password = "12345"
Monitor = yes
}

FileDaemon { # this is me
Name = at0038-fd
FDport = 9102 # where we listen for the director
# WorkingDirectory = "C:\\Documents and Settings\\All Users\\Application Data\\Bacula\\Work"
# Pid Directory = "C:\\Documents and Settings\\All Users\\Application Data\\Bacula\\Work"
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run
Maximum Concurrent Jobs = 20
}

Messages {
Name = Standard
director = at0038-dir = all, !skipped, !restored
}

bat.conf, bconsole.conf

Director {
Name = at0038-dir
DIRport = 9101
address = at0038
Password = "12345"
}

шаблон-dir.conf:

# %wintemplate% dir
# Client (File Services) to backup
Job {
Name = "%wintemplate%-job"
Maximum Concurrent Jobs = 10
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/%wintemplate%.bsr"
Client = %wintemplate%-fd
FileSet = "%wintemplate%-FileSet"
Storage = "%wintemplate%-FileStorage"
ClientRunBeforeJob = "\"C:\\Documents and Settings\\All Users\\Application Data\\Bacula\\runbefore.bat\""
ClientRunAfterJob = "\"C:\\Documents and Settings\\All Users\\Application Data\\Bacula\\runafter.bat\""
}

Client {
Name = %wintemplate%-fd
Maximum Concurrent Jobs = 10
Address = %wintemplate%
FDPort = 9102
Catalog = MyCatalog
Password = "12345" # password for FileDaemon
File Retention = 60 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}

# List of files to be backed up
FileSet {
Name = "%wintemplate%-FileSet"
Enable VSS = yes
Include {
Options {
signature = MD5
compression = GZIP
IgnoreCase = yes
Exclude = yes
WildDir = "[A-Z]:/temp"
WildFile = "*.tmp"
WildDir = "[A-Z]:/RECYCLER"
WildFile = "[A-Z]:/pagefile.sys"
WildFile = "*.mp1"
WildFile = "*.mp2"
WildFile = "*.mp3"
WildFile = "*.avi"
WildFile = "*.mpg"
WildFile = "*.mpeg"
WildFile = "*.ogg"
WildFile = "*.cdx"
}
File = C:/SystemStateBackup.bkf
}
Exclude {
}
}

# Definition of file storage device
Storage {
Name = %wintemplate%-FileStorage
Maximum Concurrent Jobs = 10
Address = at0038
SDPort = 9103
Password = "12345"
Device = %wintemplate%-FileStorage
Media Type = %wintemplate%-File
}

шаблон-dir.conf (linux):

# %nixtemplate% dir
# Client (File Services) to backup
Job {
Name = "%nixtmplate%-job"
Maximum Concurrent Jobs = 10
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/at0038.bsr"
Client = at0038-fd
FileSet = "%nixtmplate%-FileSet"
Storage = %nixtmplate%-FileStorage
}

Client {
Name = %nixtmplate%-fd
Maximum Concurrent Jobs = 10
Address = %nixtmplate%
FDPort = 9102
Catalog = MyCatalog
Password = "12345" # password for FileDaemon
File Retention = 60 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}

# List of files to be backed up
FileSet {
Name = "%nixtmplate%-FileSet"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /home
File = /etc
File = /usr/local
File = /opt
File = /root
File = /var/log
File = /var/run
File = /var/spool
}

Exclude {
File = /proc
File = /tmp
File = /.journal
File = /.fsck
}
}

# Definition of file storage device
Storage {
Name = %nixtmplate%-FileStorage
Maximum Concurrent Jobs = 10
Address = at0038
SDPort = 9103
Password = "12345"
Device = %nixtmplate%-FileStorage
Media Type = %nixtmplate%-File
}

шаблон-sd:

Device {
Name = %template%-FileStorage
Device Type = File
Media Type = %template%-File
Archive Device = /bacula/devices/%template%
Random Access = Yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
LabelMedia = yes
}

четверг, 26 февраля 2009 г.

Установка XenServer по сети

Ставим XenServer по сети с помощью WDS (Windows Deploymen Service) или RIS.

Создаем папки:
RemoteInstall\Setup\Russian\Images\xen
RemoteInstall\Setup\Russian\Images\xen\i386
RemoteInstall\Setup\Russian\Images\xen\i386\templates
RemoteInstall\Setup\Russian\Images\xen\i386\templates\pxelinux.cfg
RemoteInstall\Setup\Russian\Images\xen\i386\templates\xenserver

Создаем файл E:\RemoteInstall\Setup\Russian\Images\xen\i386\templates\pxeboot.sif:
[OSChooser]
Description = "Install Citrix XenServer"
Help = "Install Citrix XenServer"
LaunchFile = "Setup\Russian\Images\xen\i386\templates\pxelinux.0"
Version = "1.00"
ImageType=Flat


Файл pxelinux.0 берем из syslinux.
Распаковываем содержимое образа диска в папку RemoteInstall\Setup\Russian\Images\xen\i386\templates\xenserver
Организовываем доступ к этой папке по ftp и\или http (*tp://server/xenserver/)

Создаем файл RemoteInstall\Setup\Russian\Images\xen\i386\templates\pxelinux.cfg\default:
DISPLAY Install XenServer 5.0.0

DEFAULT install

LABEL install
kernel xenserver/boot/isolinux/mboot.c32
append xenserver/boot/xen.gz watchdog com1=115200,8n1i console=com1,tty --- xenserver/boot/vmlinuz root=/dev/ram0 console=tty0 console=ttyS0,115200n8 ramdisk_size=32758 --- xenserver/install.img

PROMPT 1
TIMEOUT 0


Сама установка проходит без проблем, нужно лишь указать способ установки http или ftp, и когда попросят, указать URL *tp://server/xenserver.


знания почерпнул тут

вторник, 10 февраля 2009 г.

Шум шин
Шаровые шарниры
Шипованные шины шумят на шоссе
Саммит антисемитов в ассамблее

вторник, 9 декабря 2008 г.

Установка Request Tracker 3.8.1

ЖУРНАЛ, установка RT 3.8.1

CentOS 5.2 минимальная установка
http://www.ptitov.net/2008/07/request-tracker-installation-o.html

Обновляемся после установки

wget -c http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
rpm --import RPM-GPG-KEY.dag.txt
wget -c http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
yum install rpmforge-release-0.3.6-1.el5.rf.i386.rpm
yum install yum-priorities

add line to [base], [updates], [addons]
priority=1
add line to [extras], [centosplus]
priority=2
add line to [rpmforge]
priority=12

Доставляем пакеты:
httpd \
httpd-devel \
apr-devel \
mysql \
mysql-devel \
mod_perl \
freetype-devel \
gd-devel \
libjpeg-devel \
libpng-devel \
libidn-devel \
gnutls-devel \
gcc \
perl-Apache-DBI \
perl-Apache-Session \
perl-Archive-Tar \
perl-CSS-Squish \
perl-Calendar-Simple \
perl-DBD-mysql \
perl-DBIx-SearchBuilder \
perl-DateTime-Locale \
perl-FCGI \
perl-File-ShareDir \
perl-HTML-Format \
perl-HTML-Scrubber \
perl-HTTP-Server-Simple \
perl-HTTP-Server-Simple-Mason \
perl-IO-Socket-INET6 \
perl-Locale-Maketext-Fuzzy \
perl-Locale-Maketext-Lexicon \
perl-Log-Dispatch \
perl-MIME-Types \
perl-Mail-GnuPG \
perl-Module-Refresh \
perl-Module-Versions-Report \
perl-Net-DNS \
perl-Net-Server \
perl-PerlIO-eol \
perl-Regexp-Common \
perl-TermReadKey \
perl-Test-Expect \
perl-Test-Inline \
perl-Test-WWW-Mechanize \
perl-Text-Quoted \
perl-Text-Template \
perl-Text-WikiFormat \
perl-Text-Wrapper \
perl-Time-modules \
perl-Tree-Simple \
perl-XML-RSS \
perl-XML-Simple \
perl-Net-SNMP \
perl-LDAP \
perl-GraphViz

Настраиваем cpan
perl -MCPAN -e shell

cpan -i Net::LDAP

useradd rt3 -d /opt/rt3
Добавим пользователя apache а группу rt3

./configure --with-web-handler=modperl2 --with-db-type=mysql

make testdeps
make fixdeps
make testdeps
make install
Если обновляемся то:
make upgrade

Ставим msmtp:
http://msmtp.sourceforge.net/
configure --prefix=/opt/msmtp
make
make install

/opt/rt3/etc/msmtp_wrapper.conf
account default
host smtp.gmail.com
port 587
auth on
user ithelp@myreis.ru
password ***
tls on
tls_trust_file /etc/pki/tls/certs/ca-bundle.crt
logfile /opt/rt3/var/log/msmtp.log
from ithelp@myreis.ru

/opt/rt3/etc/msmtp_wrapper
#!/bin/bash
/opt/msmtp/bin/msmtp -t -C /opt/rt3/etc/msmtp_wrapper.conf
/usr/bin/logger -t RTmailer -p syslog.info -- CALL /opt/msmtp/bin/msmtp -nt "$@" RETURNED $?

Добавляем плагин для аутентификации в LDAP:


httpd.conf:
KeepAlive On
NameVirtualHost *:80

ServerName vm-rt.alliancetravel.ru
ServerAlias vm-rt


Создаем конфиг в апаче:

ServerName rt.alliancetravel.ru
ServerAlias rt
Redirect permanent / https://rt.alliancetravel.ru/



ServerName rt.alliancetravel.ru
ServerAlias rt
ServerAdmin it@myreis.ru
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateFile /etc/pki/tls/certs/rt.crt

DocumentRoot /opt/rt3/share/html

AddDefaultCharset UTF-8
PerlRequire /opt/rt3/bin/webmux.pl


Order allow,deny
Allow from all
SetHandler perl-script
PerlResponseHandler RT::Mason


SSLEngine on



Правим файл RT_SiteConfig.pm
Set(@Plugins, qw(RT::Authen::ExternalAuth), qw(RT::FM));
Set( $rtname, 'myreis.ru');
Set($WebBaseURL , "http://rt.alliancetravel.ru");
Set( $WebPath , "");

Set($DataBaseType , 'mysql');
Set($DatabaseHost , 'mysql.alliancetravel.ru');
Set($DatabaseRTHost , 'vm-rt.alliancetravel.ru');
Set($DatabaseName , 'rt38');
Set($DatabaseUser, 'rt_user');
Set($DatabasePassword , '***');
Set($Timezone, 'Europe/Moscow');

Set($SendmailPath , "/opt/rt3/etc/msmtp_wrapper");
Set($CorrespondAddress, 'rt@myreis.ru');
Set($CommentAddress, 'rt-comment@myreis.ru');
Set($RTAddressRegexp, '^rt(-comment)?\@(myreis|moyreys|moireis.ru|moyreis.ru|alliance-travel)\.(ru)$');
Set($OwnerEmail, 'it@myreis.ru');

Set($AutoCreate, {Privileged => 1});
Set($LdapExternalAuth, 1);
Set($LdapExternalInfo, 1);
Set($LdapAutoCreateNonLdapUsers, 1);

Set($LdapRTAttrMatchList, ['Name']);
Set($LdapEmailAttrMatchList, ['mail']);
Set($LdapServer, 'ldap.alliancetravel.ru:3268');
Set($LdapUser, 'cn=ldapsearch,ou=_specialAccounts,dc=alliancetravel,dc=ru');
Set($LdapPass, '***');
Set($LdapBase, 'dc=alliancetravel,dc=ru');
Set($LdapUidAttr, 'sAMAccountName');
Set($LdapFilter, '(&(objectclass=user)(objectclass=person))');
Set($LdapSSLVersion, 3);

Set($ExternalAuthPriority, ['My_LDAP']);
Set($ExternalInfoPriority, ['My_LDAP']);

Set($ExternalSettings, {

'My_LDAP' => {
'type' => 'ldap',
'auth' => 1,
'info' => 1,
'server' => 'ldap.alliancetravel.ru',
'user' => 'cn=ldapsearch,ou=_specialAccounts,dc=alliancetravel,dc=ru',
'pass' => 'UcWelAlRaHutatcitu',
'base' => 'dc=alliancetravel,dc=ru',
'filter' => '(&(objectclass=user)(objectclass=person))',
'd_filter' => '(userAccountControl=66050)',
'tls' => 0,
'net_ldap_args' => [ version => 3 ],
# 'group' => 'CN=DL_RT_Users,OU=_Resourses,DC=alliancetravel,DC=ru',
# 'group_attr' => 'member',
'attr_match_list' => ['Name', 'EmailAddress'],
'attr_map' => { 'Name' => 'sAMAccountName',
'EmailAddress' => 'mail',
'Organization' => 'company',
'RealName' => 'cn',
'ExternalAuthId' => 'sAMAccountName',
'Gecos' => 'sAMAccountName',
'HomePhone' => 'homePhone',
'WorkPhone' => 'telephoneNumber',
'MobilePhone' => 'mobile',
'PagerPhone' => 'pager',
'Address1' => 'streetAddress',
'City' => 'l',
'State' => 'st',
'Zip' => 'postalCode',
'Country' => 'co'
}
}
}
);

1;

RTFM
Ставим RTFM

/opt/rt3/sbin/rt-setup-database --dba root --dba-password uekmrf --action init
/opt/rt3/sbin/rt-setup-database --action schema --dba rt_user --dba-password Nekgeudas --datadir /opt/rt3/local/plugins/RT-FM/etc


/opt/rt3/.fetchmailrc:
poll pop.gmail.com
proto pop3
port 995
username rt@myreis.ru
password 'Nekgeudas'
mda "/opt/rt3/bin/rt-mailgate --url http://rt.alliancetravel.ru --action correspond --queue General"
ssl
username rt-comment@myreis.ru
password 'Nekgeudas'
mda "/opt/rt3/bin/rt-mailgate --url http://rt.alliancetravel.ru --action comment --queue General"
ssl
username ithelp@myreis.ru
password 'Nekgeudas'
mda "/opt/rt3/bin/rt-mailgate --url http://rt.alliancetravel.ru --action correspond --queue ithelpdesk"
ssl
username ithelp-comments@myreis.ru
password 'Nekgeudas'
mda "/opt/rt3/bin/rt-mailgate --url http://rt.alliancetravel.ru --action comment --queue ithelpdesk"
ssl
chown rt /opt/rt3 /opt/rt3/.fetchmailrc
chmod 600 /opt/rt3/.fetchmailrc

su rt3 -c "crontab -e":
*/1 * * * * /usr/bin/fetchmail -s



Templates

Autoreply

Subject: АвтоОтвет: {$Ticket->Subject}

Здравствуйте.
Нет необходимости отвечать на это письмо прямо сейчас.
Это сообщение создано автоматически системой регистрации заявок
Вашей заявке:
"{$Ticket->Subject()}",
присвоен номер:
[{$Ticket->QueueObj->SubjectTag || $rtname} #{$Ticket->id()}].

Если вы хотите сообщить дополнительную информацию по существующей проблемме,
пожалуйста, добавьте эту строку:

[{$Ticket->QueueObj->SubjectTag || $rtname} #{$Ticket->id}]

в тему вашего письма. Также, можно просто ответить на это письмо.

Большое спасибо.
{$Ticket->QueueObj->CorrespondAddress()}

Краткая информация о заявке представлена ниже.
-------------------------------------------------------------------------
{$Transaction->Content()}
Transaction

RT-Attach-Message: yes


{$Transaction->CreatedAsString}: Заявка {$Ticket->id} в работе.
Действие: {$Transaction->Description}
Очередь: {$Ticket->QueueObj->Name}
Тема: {$Transaction->Subject || $Ticket->Subject || "(Нет темы)"}
Ответственный: {$Ticket->OwnerObj->Name}
Заявитель: {$Ticket->RequestorAddresses}
Статус: {$Ticket->Status}
Ticket Config->Get('WebURL')}Ticket/Display.html?id={$Ticket->id} >


{$Transaction->Content()}
Admin Comment

Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject); $s =~ s/\[Comment\]//g; $s =~ s/^Re//i; $s;}


{RT->Config->Get('WebURL')}Ticket/Display.html?id={$Ticket->id}
Это коментарий, он не будет выслан запросившим:

{$Transaction->Content()}
Status Change

Subject: Статус изменен: {$Transaction->NewValue}


{RT->Config->Get('WebURL')}Ticket/Display.html?id={$Ticket->id}

{$Transaction->Content()}
Resolved

Subject: Готово: {$Ticket->Subject}

Проблема с которой вы столкнулись решена,
если есть новые замечания по этой проблеме, пожалуйста,
Ответьте на это письмо.

-------------------------------------------------------------------------
{$Ticket->Subject}

Forward


Переадресация #{ $Transaction->id } заявки #{ $Ticket->id }

Error: Missing dashboard

Subject: [{RT->Config->Get('rtname')}] Не найдена инормационная панель!

Здравствуйте,

Вы подписались на инормационную панель, которой не существует. Скорее всего, инормационная панель была удалена.

Система удалит эту подписку за не надобностью. Ниже представлена инормация о вашей подписке:

Инфо панель: { $SubscriptionObj->SubValue('DashboardId') }
Частота: { $SubscriptionObj->SubValue('Frequency') }
Час: { $SubscriptionObj->SubValue('Hour') }
{
$SubscriptionObj->SubValue('Frequency') eq 'weekly'
? "Day of week: " . $SubscriptionObj->SubValue('Dow')
: $SubscriptionObj->SubValue('Frequency') eq 'monthly'
? "Day of month: " . $SubscriptionObj->SubValue('Dom')
: ''
}

Создаем Пользователей, Группы, Очереди ...

Создаем группу: Administrators, ithelpdesk, ithelpdeskManagers, RTFMAuthors, RTFMAdmins
Раздаем членство в группах:
EveryOne
Administrators
ithelpdesk
ithelpdeskManagers
RTFMAuthors
RTFMAdmins

Создаем Очередь
Queue Name: ithelpdesk
Description: Заявки в ИТ отдел
Subject Tag: ИТ отдел
Reply Address: ithelp@myreis.ru
Comment Address: ithelp-comments@myreis.ru

Раздаем права:
Global:
Для группы EveryOne: ModifySelf
Для группы Administrators: SuperUser

Очередь ithelpdesk
группе EveryOne: CreateTicket, ReplyToTicket
группе ithelpdesk: DeleteTicket, ModifyTicket, OwnTicket, SeeQueue, ShowTicket, TakeTicket, Watch
группе ithelpdeskManagers: AdminQueue, StealTicket, WatchAsAdminCce
Для очереди ithelpdesk назначаем Наблюдателей CC: группа ithelpdesk, Admin CC: группа ithelpdeskManagers

RTFM
Даем группе Everyone права: SeeClass, ShowArticle
Даем все права группе RTFMAdmins
Даем группе RTFMAuthors права: CreateArticle, ModifyArticle, ModifyArticleTopics, ShowArticleHistory

среда, 13 августа 2008 г.

DFL-800 Сервер на двух каналах

Например PPTP сервер на двух каналах:
DFL-800. Как сделать PPTP server на двух каналах сразу?
А вот как:
1. Создаем два сервера PPTP
Сначала проверяем что работает 1, потом меням маршрут по умолчанию на другого провайдера и проверяем что работает второй.
2. Создаем маршруты по умолчанию в таблицу main:

Type: Route
Interface: wan1
Network: allnets
Gateway: wan1_gw
Local IP address:
Metric: 90
Monitor tis route: Yes
Comment:

Type: Route
Interface: wan2
Network: allnets
Gateway: wan2_gw
Local IP address:
Metric: 100
Monitor tis route: Yes
Comment:

Type:
Interface:
Network:
Gateway:
Local IP address:
Metric:
Monitor tis route:
Comment:

3. Создаем две даблицы маршрутизации alt1 и alt2
Создаем в каждой под два маршрута:
Таблица alt1:
Type: Route
Interface: wan1
Network: wan1net
Gateway:
Local IP address: wan1_ip
Metric: 100
Monitor tis route: No
Comment:

Type: Route
Interface: wan1
Network: allnets
Gateway: wan1_gw
Local IP address: wan1_ip
Metric: 100
Monitor tis route: No
Comment:

Таблица alt2:
Type: Route
Interface: wan2
Network: wan2net
Gateway:
Local IP address: wan2_ip
Metric: 100
Monitor tis route: No
Comment:

Type: Route
Interface: wan2
Network: allnets
Gateway: wan2_gw
Local IP address: wan2_ip
Metric: 100
Monitor tis route: No
Comment:

Создаем правила в RoutingRules:
#: 1
Name: to_wan1net
Source interface: wan1
Source network: all-nets
Destination interface: wan1
Destination network: wan1net
Service: all
Comment:
Forward Table: main
Return Table: alt1

#: 2
Name: to_wan2net
Source interface: wan2
Source network: all-nets
Destination interface: wan2
Destination network: wan2net
Service: all
Comment:
Forward Table: main
Return Table: alt2

#: 3
Name: default_via_wan1
Source interface: wan1
Source network: all-nets
Destination interface: any
Destination network: all-nets
Service: all
Comment:
Forward Table: main
Return Table: alt1

#: 4
Name: default_via_wan2
Source interface: wan2
Source network: all-nets
Destination interface: any
Destination network: all-nets
Service: all
Comment:
Forward Table: main
Return Table: alt2


Всё, в результате, все пакеты которые приходят на интерфейс WAN1 будут уходить через WAN1 тоже самое и для интерфейса WAN2. Также, если пакет идет в сеть одного провайдера, то его отправят через интерфейс подключеный к этому провайдеру.

пятница, 21 декабря 2007 г.

SCRIPT Оставить только 5 файлов, всё остальное удалить

Оставить только 5 файлов, всё остальное удалить:

::== keep5.bat
@echo off
setLocal EnableDelayedExpansion

for /f "tokens=* delims=" %%A in ('dir backup* /b/a-d/o-d') do (
set /a kept+=1
echo !kept!
if !kept! geq 5 call :sub1 %%A
)
goto :eof

:sub1
rem echo del "%*"
del "%*"
goto :eof
:: DONE