Gnome-terminal как фон рабочего стола..

Written by Valor on Март 12th, 2010

Захотелось странного..  Хочу что-бы консоль была фоном рабочего стола.  Не отвлекаясь на преамбулы, возьмемся за решение поставленной задачи.

На просторах интернетов набрел на занятный тузлец Alltray (AllTray – Dock any program into the system tray.) , полистав man – понял, что для решения нашей задачи оно может сгодиться.

И так решение.

В качестве эмулятора терминала берем стандартный для Gnome – Gnome-terminal, дистрибутив Debian..

Для начала малость подрехтуем сам gnome-terminal:

  1. Создаем новый профиль.
  2. Отключаем отображения верхнего меню.
  3. Отключаем полосы прокрутки.
  4. Увеличиваем буфер строк (для удобства).
  5. Выкручиваем до упора прозрачность фона терминала.
  6. Подгоняем цвет консольных шрифтов под цвет фона рабочего стола.
  7. Остальное по вкусу..

Устанавливаем alltray

1
viktor@viktor-laptop:~$ apt-get install alltray

Ну и финальный штрих в авто-запуск (тут неважно как именно, важна суть..) добавляем следующую строку:

1
alltray --show --sticky --skip-taskbar --no-alltray --notray -x -g +800+0 --geometry 1024x600 gnome-terminal --window-with-profile=s

Лично я добавлял ее в Система->Параметры->Запускаемые приложения.

Да и пару слов об опциях alltray..

  • show – не сворачивать при запуске
  • sticky – отображать на всех рабочих столах
  • skip-taskbar – убрать приложение из панели задач
  • no-alltray – убрать заголовок alltray
  • notray – не показывать значёк в трее
  • x – убрать декорацию окон
  • +800+0 – позиция окна на рабочем столе (первое – горизонталь, второе – вертикаль)
  • geometry 1024×600 – разрешение рабочего стола (это если нужно растянуть терминал на весь рабочий стол, иначе просто указываем нужную геометрию окна терминал)
  • window-with-profile=s – это уже параметр gnome-terminal говорящий о том, что при запуске нужно заюзать профиль «s», который мы создали выше.

Ну вот и все.. Перезагружаем иксы и ликуем..

Все эти выше описанные манипуляции выполнялись на Asus EeePC 1005 с Debian Sqeeze и Gnome 2.28.1..

Пользователей KDE, Xfce, etc..  очень прошу оставить свои комментарии по поводу различий и нюансов в реализации данной фичи.

Скрины на память…

Терминал как фон рабочего стола

Терминал как фон рабочего стола

 

Xen 3.2-1 and HVM Windows config

Written by Valor on Март 10th, 2010

Очередной пост для себя любимого.. Но и Вы гости дорогие жуйте если что не стесняйтесь..

Сие есть просто файл конфигурации HVM домена с Win2k3..

Пост не претендует на новизну и оригинальность.

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
kernel="hvmloader"
device_model = 'qemu-dm'
builder='hvm'
memory = 5120
name = "win2k3
vcpus= 4
pae=1
acpi= 1
apic= 1
#usb= 1 разкомментировать если нужна поддержка USB в гостевой ОС. #usbdevice= [ 'host:0529:0514' ]  DID, USB устройства которое нужно пробросить.
cpus = "
2-5"
vif=[ 'mac=00:16:3e:01:01:01,bridge=eth0,type=ioemu' ]
disk = [
'file:/C.img,hda,w',
'file:/D.img,hdb,w'
]
'file:/win2003/win2003.iso,hdc:cdrom,r',
'file:/win2003-2.iso,hdd:cdrom,r'
#]
on_poweroff = 'destroy'
on_shutdown = 'shutdown'
on_reboot   = 'restart'
on_crash    = 'restart'
boot='c'
sdl=0
vnc=1
vnclisten="
0.0.0.0"
vncconsole=0
stdvga=0
serial='pty'

Note:

Для тех кто не в курсе.. Для работы HVM домена необходима поддержка Intel®Virtualization Technology (VT) или Pacifica (AMD)  процессором (ами) сервера. Проверить можно следующими способами:

1
2
3
4
5
6
7
8
9
10
11
# xm info | grep caps
hw_caps                : 178bfbff:ebd3fbff:00000000:00000010:00002001:00000000:0000001f
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p

# xm dmesg | grep VMX
(XEN) VMXON is done
(XEN) VMXON is done

# xm dmesg | grep -i svm
(XEN) AMD SVM Extension is enabled for cpu 0.
(XEN) AMD SVM Extension is enabled for cpu 1.

Траблы:

  • Через опу работает AMD VT-d в силу зачаточности реализации..
  • Через туда же работает USB .
  • При установки паравиртуальных драйверов для Windows (В частности Win2k3) отваливаются CDROM`ы.. (на версии драйвера gplpv_2003×64_0.11.0.188 от 3 января  2010 г.)

Ну на этом с траблами вроде все, по крайней мере я более не обнаружил..

Кстати вопреки слухам о запущенности и унынии свободной реализации паравиртуальных драйверов для виндовсов.. Отнюдь.. Драйвера активно разрабатываются и они довольно таки стабильны. Кому надо, ссылка в конце поста.

Хозяйке на заметку:

  1. В качестве виртуального HDD для гостевой ОС предпочтительнее использовать блочное устройство, нежели файловое.  Синтаксис опции : phy:UNAME,DEV,MODE
  2. Для ОС семейства MSWindows (особенно серверных) установки паравиртуальных драйверов крайне предпочтительна, ибо в качестве профита появится многоканальный SATA контроллер, 1G сетевой адаптер и.т.д в зависимости от типа ОС (сие особенно полезно если в гостевом сервере крутится БД ).

Полезные ссылки:

 

Отслеживание изменений в /etc с помощью etckeeper и Git

Written by Valor on Февраль 19th, 2010

Собственно вот.. Объяснять для чего это не буду, кому надо тот поймет.

И так ставим etckeeper из репов..

1
wall:~# apt-get install etckeeper

Далее все просто..

1
2
3
4
5
6
7
8
9
wall:~# cd /etc/
wall:/etc# etckeeper init
Initialized empty Git repository in /etc/.git/
wall:/etc#etckeeper commit 'Init Сommit'
wall:/etc# git gc
Counting objects: 1476, done.
Compressing objects: 100% (1068/1068), done.
Writing objects: 100% (1476/1476), done.
Total 1476 (delta 91), reused 0 (delta 0)

Далее нам надо сделать так чтобы файлы конфигураций вновь установленных программ автоматом попадали в репозиторий.
Для этого надо разкомментировать строку AVOID_COMMIT_BEFORE_INSTALL=1 в файле /etc/etckeeper/etckeeper.conf .

Ну и запишем изменения :

1
2
3
wall:/etc# git commit -a -m 'Uncomment option in etckeeper.conf'
Created commit b26ec5d: Uncomment option in etckeeper.conf
 1 files changed, 1 insertions(+), 1 deletions(-)

За дополнительной информацией по работе с Gig лезем в Man.

Все! :)

 

Pixel Studio Pro качественный клон PhotoShop

Written by Valor on Февраль 5th, 2010

Не рекламы ради, а профита для .. пишу сии строки.. Наслушавшись воплей о том, что Linux и работа с графикой вещи не совместимы ввиду отсутствия вменяемых инструментов.. С одной стороны для моего недохудожества и недодизайна вполне хватает Gimp`a, с другой, наблюдая работу фотошопера начинаю понимать, что в претензиях сих смысл имеет место быть.. Пускаться в длительное словоблудие описывая все недостатки и приимущества Gimp и PhotoShop я не стану, ибо все это знают (кто не знает ССЗБ ).
Так вот перейдем сразу к делу, а именно к альтернативам. Сия альтернатива должна соответствовать некоторому количеству требований.

  1. Лёгкость – т.е. программа не должна выжирать 1Гб ОЗУ и не жрать 100% процессорного времени на примитивных операциях.
  2. Поддержка  каналов СMY, CMYK, HSB на ровне с RGB.
  3. Нативная поддержка Linux. (имеется ввиду отсутствие всяких WINE и прочей межплатформенной абстракции).

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

В общем побороздив просторы интернетов наткнулся я на один занятный проект, имя ему Pixel Studio Pro и понял это ОН(!). Да да именно ОН..

В кратце опишу это чудо враждебной техники.

  • Продукт более чем удовлетворяет нашим исходным требованиям. Он легок (примерно 35М в распакованном виде) и около 12М ОЗУ в пассивном режиме.
  • Поддерживает СMY, CMYK, HSB, HDR, CIELab ….Jpeg2000
  • Векторные слои.

Подробный фичерс лист  тут .

Скриншотики тут

На результаты работы смотрим тут

Да важно!! Продукт пропреитарный скорее всего в силу лицензионных отчислений за поддержку СMY, CMYK, HSB, HDR, CIELab.. Но цена вменяема от 33 до 80 евро..

ЗЫ. Буду рад если кто-то из настоящих спецов сделает свою экспертную оценку этой программы, именно в плане различий функционала (критичности этих различий).

Вот скриншотик сей программки на моем eeepc 1005.

111

 

Сборка расширейний для Iptables в Debian

Written by Valor on Январь 21st, 2010

Данная заметка (именно заметка !) сделана в основном для себя , дабы не забыть.  Ну и для масс, авось кому понадобится.

И так кратко (для масс!), что есть Iptables extensions, это набор патчей для Iptables существенно расширяющий его функционал. В Debian Lenny эти патчи собраны в пакете netfilter-extensions-source , подробнее о составе пакета  можно почитать здесь, там же можно найти примеры по использованию.

И так качаем и ставим пакет netfilter-extensions-source:

1
apt-get install netfilter-extensions-source linux-headers-`uname -r`

Внимание! Тянет много зависимостей.

Ну и собственно сборка:

1
2
m-a build netfilter-extensions
m-a update && m-a a-i netfilter-extensions

Ну вот и все :)

 

Mandrake 10.0 и KDE 3.2

Written by Valor on Ноябрь 29th, 2009

Разговором о KDE в Jabber конференции навеяна сия краткая заметка. Нашел на полке коробку с Mandrake 10.0 и решил вспомнить как оно выглядело в далеком (хотя и не очень) 2004 году. Был еще диск с Mandrake 9.1 но он оказался сильно поврежденным и устанавливаться отказался :( .

Mandrake 10.0 ставился на ВМ и завелся он довольна таки не принужденно, так же не принужденно были подхвачены звук, видео, интернеты и т.д.

Смотрим, что получилось и ностальгируем.

 

Резервное копирование Zimbra CS OSE

Written by Valor on Ноябрь 27th, 2009

zimbra_logo

Самый большой недостаток Zimbra CS OSE, это отсутствия нативных инструментов для создания резервных копий. В связи с этим пытливыми умами было написано немало всевозможных скриптов призванных выполнять данную функцию. Со всем многообразием этих самых скриптов можно ознакомится в соответствующем разделе Zimbra Wiki.

На всякий случай выложу один из вариантов (на мой взгляд один из самых удачных) скрипта для резервного копирования.

Сайт разработчиков

Ну и собственно сам скрипт.

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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
#!/bin/bash
## *** Info ***
# USAGE:    -h or --help for help & usage.
#           -f or --full for Full backup.
#           -d or --diff for Diff backup.
#           -V or --version for version info.
#           --INSTALL    for script install and setup.
#
# This is a backup script for the FOSS version of Zimbra mail server.
# The script is free and open source and for use by anyone who can find a use for it.
#
# THIS SCRIPT IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
# HOLDERS AND/OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS DOCUMENT, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# What this script does:
# 1. Makes daily off-line backups, at a service downtime of ~ < 2 min.
# 2. Weekly backup cycle - 1 full backup & 6 diffs.
# 3. Predefined archive sizes, for writing backups to CD or DVD media...
# 4. Backup archive compression.
# 5. Backup archive encryption.
# 6. Backup archive integrity checks and md5 checksums creation.
# 7. Automated DR - Off-site copy of backup archives via ssh.
# 8. Install and setup function for needed sofrware (Ubuntu Systems only)
# 9. Weekly eMail report & eMail on error - including CC address.
#
# This script makes use of following tools:
# apt-get, cron, dar, dpkg, mailx, md5sum, rsync, ssh, uuencode, wget, zimbra mta.
#
# We have opted to use a pre-sync directory to save on "down time", but this
# causes one to have huge additional space usage.
# But hard drives are cheep today!
#
# What is still to come or needs work on:
# 1. Recover option
# 2. Better documentation
#
#------- CONFIG -------#
# Edit this part of the script to fit your needs.
#

#--- Directories ---#
# Please add the trailing "/" to directories!
ZM_HOME=/opt/zimbra/
SYNC_DIR=/tmp/fakebackup/
ARCHIVEDIR=/home/archive/bkp/
TOO_MEDIA_DIR=/home/media/bkp/old/

#
#--- PROGRAM OPTIONS ---#
RSYNC_OPTS="-aHK --delete --exclude=*.pid"

#
#--- ARCHIVE NAMES ---#
BACKUPNAME="Zimbra_Backup"
BACKUPTYPE_F="FULL" # name prefix to sort between full and diff backups
BACKUPTYPE_D="DIFF"
BACKUPDATE=`date +%d-%B-%Y`

#
#--- ARCHIVE SIZE ---#
# storage media size
ARCHIVESIZE="1000M"
COMPRESS="9"        # valid answers are 1 - 9 ( 9 = best )

CRYPT="yes"     # valid answers are "yes" or "no"
PASSDIR=/etc/zmbac/
PASSFILE="bac.cf"

#
#--- EMAIL ADDRESS ---#
EMAIL=""
EMAILCC=""
LOG=""

#--- SSH REMOTE DR COPY ---#
# This option will secure copy you archives to a remote server via 'scp'
DRCP="no"       # valid answers are "yes" or "no"
SSHUSER="heinzg"
SSHKEY="rsa"     # recommended answers are "rsa" or "dsa" but "rsa1" is also valid.
REMOTEHOST="172.16.184.1"
REMOTEDIR="/tmp/"

#--- USE HACKS !?! ---#
# Built in hacks to fix common problems
#Hack to start Stats, even run zmlogprocess if needed
STATHACK="yes"      # valid answers are "yes" or "no"

## ~~~~~!!!! SCRIPT RUNTIME !!!!!~~~~~ ##
# Best you don't change anything from here on,
# ONLY EDIT IF YOU KNOW WHAT YOU ARE DOING
#
#

# Check if Zimbra install dir is there
if [ ! -d $ZM_HOME ]
then
echo "$ZM_HOME not found!"
exit 1
fi

if [ ! -d $SYNC_DIR ]
then
mkdir $SYNC_DIR
fi

# Check the script is being run by root, or die.
ROOT_UID=0
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Run script as "root"."
echo
exit 1
fi

# Create Log file
touch $LOG

# Script Timer
STARTTIME=(`date +%s`)

# Week prefix used for backup weekly rotation and naming
BACKUPWEEK=`date +%W`

# Finding out who is the zimbra proc user
ZM_USER=`ps -ef | grep "$ZM_HOME" | grep "java" | grep -v "zmmailboxdmgr" | awk '{print $1}' | head -n 1`
if [ -z $ZM_USER ]
then
echo "Unable to determan the zimbra user"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
elif [ $ZM_USER = "root" ]
then
echo "Zimbra user should never be root! I'll die now..."
# send email....
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

# Location of Zimbra's PID files
STATPIDBASE="$ZM_HOME""zmstat/pid/"

case $1 in
-V | --version)
echo
echo "Version 1.02"
echo "first published Feb 08"
echo
echo "Change Log March 08:"
echo "- Use the su command insted if sudo to stop and start services"
echo "- Using shutdown insted of stop with zmcontrol"
echo "- DATE_VERSION.txt now contains date and version and is created with full backups"
echo "- Built in some more checks"
echo "- eMail notification on error"
echo "- Documentation - Added more comments"
echo "- Dar archive is now built from current dir"
echo "- Stats hack to make sure stats is starting again"
echo "- 260 more lines of code... and who knows how many bugs"
echo
;;

-h | --help)
echo
echo "Configure the "CONFIG" part of the script to suit your needs."
echo
echo "USAGE:    -h or --help for help & usage."
echo "          -f or --full for Full backup."
echo "          -d or --diff for Diff backup."
echo "          --INSTALL    for script install and setup."
echo
echo "Usage with cron, e.g."
echo "0 3 * * 1     /bin/bash     /root/zmbac.sh -f > $LOG 2>&1"
echo "0 3 * * 2-7   /bin/bash     /root/zmbac.sh -d >> $LOG 2>&1"
echo
;;

--INSTALL)

# Check for configured Directories or Create them

if [ ! -d $SYNC_DIR ]
then
echo
echo "$SYNC_DIR not found!"
echo -n "Create $SYNC_DIR "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
mkdir -vp -m 600 $SYNC_DIR
else
echo "Please check script Config, and try again"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi

if [ ! -d $ARCHIVEDIR ]
then
echo
echo "$ARCHIVEDIR not found!"
echo -n "Create $ARCHIVEDIR "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
mkdir -vp -m 600 $ARCHIVEDIR
else
echo "Please check script Config, and try again"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi

if [ ! -d $TOO_MEDIA_DIR ]
then
echo
echo "directory $TOO_MEDIA_DIR not found!"
echo -n "Create $TOO_MEDIA_DIR "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
mkdir -vp -m 600 $TOO_MEDIA_DIR
else
echo "Please check script Config, and try again"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi

# Check for needed software or try install it

MAILX=`whereis mailx | awk '{print $2}'`
if [ ! -e "$MAILX" ]
then
echo
echo "'mailx' is not installed!"
echo
echo "For a "Howto" install mailx without postfix please visit the link below"
echo "http://www.zimbra.com/forums/administrators/13528-sending-email-comand-line-logwatch-ubuntu-6-06-a.html#post70636"
echo
echo "Should I "try" install this for you?"
echo
echo "!! Only say yes if you are running Ubuntu!!"
echo
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
echo
echo "Downloading "mta-dummy" package to "/tmp""
cd /tmp
wget -v -S -c -t 40 --random-wait -T 60 http://ubuntu.lnix.net/misc/mta-dummy/mta-dummy_1.0_all.deb
if [ "$?" -ne "0" ]
then
echo "Had some form of problem getting the mta-dummy package... ask for help in the forums"
echo
exit 1
fi
echo
dpkg -i mta-dummy_1.0_all.deb
if [ "$?" -ne "0" ]
then
echo "Had some form of problem getting installing the mta-dummy package... ask for help in the forums"
echo
exit 1
fi

echo
echo
apt-get -y install mailx
if [ "$?" -ne "0" ]
then
echo "Had some form of problem installing 'mailx'... ask for help in the forums"
echo
exit 1
fi
echo
echo "Writing config file "/etc/mail.rc""
echo "set sendmail=$ZM_HOME"postfix/sbin/sendmail"" >> /etc/mail.rc
else
echo "This script would like to send you a mail or two... so please install a dummy mta for your Distro"
echo
exit 1
fi
fi

UUENCODE=`whereis uuencode | awk '{print $2}'`
if [ ! -e "$UUENCODE" ]
then
echo
echo "'uuencode' is not installed!"
echo
echo "Should I "try" install 'uuencode' for you?"
echo
echo "!! Only say yes if you are running Ubuntu!!"
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
apt-get -y install sharutils
if [ "$?" -ne "0" ]
then
echo "Had some form of problem installing "sharutils"... ask for help in the forums"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi
fi

DAR_BIN=`whereis dar | awk '{print $2}'`
if [ ! -e "$DAR_BIN" ]
then
echo
echo "'dar' is not installed!"
echo
echo "Should I "try" install 'dar' for you?"
echo
echo "!! Only say yes if you are running Ubuntu!!"
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
apt-get -y install dar
if [ "$?" -ne "0" ]
then
echo "Had some form of problem installing "dar"... ask for help in the forums"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi
fi

SSH_BIN=`whereis ssh | awk '{print $2}'`
if [ ! -e "$SSH_BIN" ]
then
echo
echo "Please install "ssh"!"
echo
echo "Should I "try" install a 'ssh client & server' for you?"
echo
echo "!! Only say yes if you are running Ubuntu!!"
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
apt-get -y install openssh-server
if [ "$?" -ne "0" ]
then
echo "Had some form of problem installing "openssh-server"... ask for help in the forums"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
echo
exit 1
fi
fi
fi

if [ $CRYPT = "yes" ]
then
if [ ! -d "$PASSDIR" ]
then
echo "Create $PASSDIR"
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
mkdir -vp -m 600 $PASSDIR
echo "done"
echo
else
echo "Please check script Config, and try again"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi
fi

if [ ! -e "$PASSDIR""$PASSFILE" ]
then
echo "Create $PASSFILE"
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
touch "$PASSDIR""$PASSFILE"
chmod 600 "$PASSDIR""$PASSFILE"
echo "'G'enerate or 'E'nter a secure passphrase"
echo -n "please enter G or E: "
read ANSWER
if [ "$ANSWER" = "G" ]
then
openssl rand -base64 48 -out "$PASSDIR""$PASSFILE" 2>/dev/null
else
echo -n "Enter a secure passphrase: "
read PASSPHRASE
echo $PASSPHRASE > "$PASSDIR""$PASSFILE"
echo "done"
echo
fi
else
echo "Please check script Config, and try again"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi

echo
if [ $DRCP = "yes" ]
then
echo
echo "For 'scp' to work, you have to have setup PKI authentication (passwork less login)"
echo "Should I try setup this for you?"
echo "If you have a key an PKI authentication works answer 'n'"
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
ssh-copy-id "$SSHUSER"@"$REMOTEHOST"
if [ "$?" -ne "0" ]
then
echo "$?"
echo -n "Create ssh ID? "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
echo "Please except the 'defaults'and DO NOT ENTER A 'passphrase' !!"
ssh-keygen -t "$SSHKEY"
echo
echo "copying your ID to $REMOTEHOST"
echo "please enter your '$SSHUSER' user password on '$REMOTEHOST' at the prompt"
if [ "$SSHKEY" = "rsa" ]
then
ssh-copy-id -i /root/.ssh/id_rsa "$SSHUSER"@"$REMOTEHOST"
elif [ "$SSHKEY" = "dsa" ]
then
ssh-copy-id -i /root/.ssh/id_dsa "$SSHUSER"@"$REMOTEHOST"
elif [ "$SSHKEY" = "rsa1" ]
then
ssh-copy-id -i /root/.ssh/identity "$SSHUSER"@"$REMOTEHOST"
fi
fi
fi
fi
fi

echo
echo "Install cronjob to automate the nightly backups"
echo -n "install "y" or "n": "
read ANSWER
if [ $ANSWER = "y" ]
then
crontab -l > $HOME/.crontab.save
echo "Setting the time when to start the backup cycle"
echo -n "At what hour? 0-23: "
read HOUR
echo
echo -n "and what minute do you want the backup to start? 0-59: "
read MINUTE
echo
echo "path to script e.g. /root/scripts"
read SPATH
echo "" >> $HOME/.crontab.save
echo "$MINUTE $HOUR * * 1     /bin/bash     $SPATH/zmbac.sh -f > $LOG 2>&1" >> $HOME/.crontab.save
echo "$MINUTE $HOUR * * 2-7   /bin/bash     $SPATH/zmbac.sh -d >> $LOG 2>&1" >> $HOME/.crontab.save
echo "" >> $HOME/.crontab.save
crontab $HOME/.crontab.save
rm $HOME/.crontab.save
echo
crontab -l
echo
echo "Done setting up crontab"
echo
fi

;;

-f | --full)
echo
echo "      Full Backup started at: `date +%H:%M`"
echo
DAR_BIN=`whereis dar | awk '{print $2}'`
if [ ! -e "$DAR_BIN" ]
then
echo "Please install "dar"!"
echo "Try running the script with --INSTALL"
exit 1
fi

MAILX=`whereis mailx | awk '{print $2}'`
if [ ! -e "$MAILX" ]
then
echo "mailx is not installed!"
echo "Try running the script with --INSTALL"
exit 1
fi

RSYNC_BIN=`whereis rsync | awk '{print $2}'`
if [ ! -f "$RSYNC_BIN" ]
then
echo $SYNC_BIN
echo "Please install "rsync"!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

SSH_BIN=`whereis ssh | awk '{print $2}'`
if [ ! -e "$SSH_BIN" ]
then
echo "Please install "ssh"!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

MD5SUM_BIN=`whereis md5sum | awk '{print $2}'`
if [ ! -e "$MD5SUM_BIN" ]
then
echo "Please install "md5sum"!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $ZM_HOME ]
then
echo "$ZM_HOME not found!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $SYNC_DIR ]
then
echo "$SYNC_DIR not found!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $ARCHIVEDIR ]
then
echo "$ARCHIVEDIR not found!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $TOO_MEDIA_DIR ]
then
echo "directory $TOO_MEDIA_DIR not found!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
echo
exit 1
fi

# Look for old backups and put then in directory from where you write them to some form of
# storage media
LAST_FULL_DAR=`ls -A -1 $ARCHIVEDIR | grep $BACKUPNAME | cut -d _ -f1 | head -n1`

if [ -z "$LAST_FULL_DAR" ]
then
echo "No old backups found"

elif [ "$LAST_FULL_DAR" -lt "$BACKUPWEEK" ]
then
echo "Old backups found...old week= $LAST_FULL_DAR current week= $BACKUPWEEK"
echo
for i in `ls -A -1 "$ARCHIVEDIR""$LAST_FULL_DAR"_"$BACKUPNAME"*`
#for i in `ls -A -1 "$ARCHIVEDIR""$LAST_FULL_DAR"_"$BACKUPNAME"*dar`
do
mv $i $TOO_MEDIA_DIR
if [ "$?" -ne "0" ]
then
echo "error during move!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "$i moved to $TOO_MEDIA_DIR"
fi
done
fi

# Checking for a backup file collisions. Creating Date and Marker file.
CURRENTNAME1=`ls -A -1 "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F"*dar 2> /dev/null | head -qn1`
if [ -f "$CURRENTNAME1" ]
then
echo
echo "Full Zimbra Backup failed!"
echo "FOUND A BACKUP WITH SAME NAME IN $ARCHIVEDIR >> Please check why ????"
echo "!! You should only run this script once a day with the current backup date settings !!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
su - "$ZM_USER" -c $ZM_HOME"bin/zmcontrol -v" > /dev/null
if [ -z "$?" ]
then
echo
echo "zmcontrol has some problems! check config or call for help..."
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo
echo "Setting date & version Marker into "$ZM_HOME"DATE_VERSION.txt"
echo
echo "$BACKUPDATE" > "$ZM_HOME"DATE_VERSION.txt
su - "$ZM_USER" -c $ZM_HOME"bin/zmcontrol -v" | grep ^R >> "$ZM_HOME"DATE_VERSION.txt
fi

# HotSync to backup directory
echo "Doing a hotsync of $ZM_HOME to $SYNC_DIR"

nice -19 $RSYNC_BIN $RSYNC_OPTS $ZM_HOME $SYNC_DIR
if [ "$?" -ne "0" ]
then
echo
echo "rsync had threw an hotsync error this is not that wild... continuing"
#cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
else
echo "sync went ok"
echo
fi

# Stopping Zimbra
echo "Stopping the Zimbra server"
echo

#Disable zimbra user's crontab, we don't want it starting any jobs while we backup
crontab -u $ZM_USER -l > "$ZM_HOME"crontab.org
if [ "$?" -ne "0" ]
then
echo "could not backup "$ZM_USER"'s crontab..."
echo "continuing with out changing users crontab!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
touch "$ZM_HOME"crontab.blank
crontab -u $ZM_USER "$ZM_HOME"crontab.blank
rm "$ZM_HOME"crontab.blank
echo "Deactivated "$ZM_USER"'s cronjobs"
echo
fi

#Starting 'service downtime' counter
DOWNTIMEA=(`date +%s`)

su - $ZM_USER -c $ZM_HOME"bin/zmcontrol stop"
if [ "$?" -eq "1" ]
then
echo "zmcontrol shutdown had an error!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo
echo "Zimbra server has stopped "
fi
echo
# Some times I still have zimbra procs running, so I murder them! :-O
sleep 5
echo "kill any left over $ZM_USER procs"
PROX=(`ps -u $ZM_USER | awk '{print $1}' | grep -v PID`)
if [ "$PROX" ]
then
ps -u $ZM_USER | awk '{print $1}' | grep -v PID | xargs kill -s 15
echo "Did a Mr. Bush on some left over procs..."
echo
else
echo "Nothing to kill"
echo
fi
# ColdSyncing the zimbra server
echo "Doing a fast cold sync..."

$RSYNC_BIN $RSYNC_OPTS $ZM_HOME $SYNC_DIR
if [ "$?" -ne "0" ]
then
echo "rsync had threw an error!"
echo "This should not happen at this stage... exiting!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "sync went ok"
fi
echo

# Starting the Zimbra server again

#Reinstate zimbra user's crontab
crontab -u $ZM_USER "$ZM_HOME"crontab.org
if [ "$?" -ne "0" ]
then
echo "!!Could not reinstate "$ZM_USER"'s crontab!!"
echo "Please do this manually!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Reinstated "$ZM_USER"'s cronjobs"
echo
fi

su - "$ZM_USER" -c $ZM_HOME"bin/zmcontrol start"
if [ "$?" -ne "0" ]
then
echo "There was an error starting Zimbra!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo
echo "Zimbra has started"
fi
# Service Timerc
DOWNTIMEB=(`date +%s`)
RUNTIME=$(expr $DOWNTIMEB \- $DOWNTIMEA)
hours=$(($RUNTIME / 3600))
seconds=$(($RUNTIME  % 3600))
minutes=$(($RUNTIME  / 60))
seconds=$(($RUNTIME  % 60))
echo
echo "Service down time was - Hr:$hours Min:$minutes Sec:$seconds"
echo

# Hack to start the stats component
if [ $STATHACK = "yes" ]
then
echo "Running A hack... This one to check and start Stats subsystem"
#Checking if Stats is running
sleep 5
STAT_CK=(`su - "$ZM_USER" -c $ZM_HOME"bin/zmcontrol status" |grep -i stats | awk '{print $2}'`)
if [ "$STAT_CK" = "Stopped" ]
then
echo "Stats is not running, thus booting Stats subsystem!"
echo
# Stopping Stats
su - $ZM_USER -c $ZM_HOME"bin/zmstatctl stop"
if [ "$?" -ne "0" ]
then
echo "Stopping stats failed!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Stats have been stopped"
echo
fi

# Running Stats cronjob zmlogprocess manually
su - $ZM_USER -c $ZM_HOME"libexec/zmlogprocess" > /tmp/logprocess.out 2>&1
if [ "$?" -ne "0" ]
then
echo "Error running 'logprocess'"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Logprocess done..."
echo
fi

# Running Stats cronjob zmqueuelog manually
su - $ZM_USER -c $ZM_HOME"libexec/zmqueuelog"
if [ "$?" -ne "0" ]
then
echo "Error running 'libexec/zmqueuelog'"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "zmqueuelog done..."
echo
fi

# Starting Stats
sleep 2
su - "$ZM_USER" -c $ZM_HOME"bin/zmstatctl start"
if [ "$?" -ne "0" ]
then
echo "Starting stats failed!"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Stats started..."
fi
else
echo "Hack not needed Stats seems to be running fine..."
fi
fi

# Status Check to see that is running
STATUS=(`su - "$ZM_USER" -c "/opt/zimbra/bin/zmcontrol status" | grep -i Stopped`)
if [ "$STATUS" ]
then
echo
echo "Services that are not running"
echo $STATUS
cat $LOG | mail -c $EMAILCC -s "Zimbra Services Stopped on `hostname --fqdn`" $EMAIL
else
echo
echo "All services are running"
echo
fi
echo
echo "Writing a full backup called:"
echo "      $BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F"
echo "in: $ARCHIVEDIR with file sizes of max: $ARCHIVESIZE"
cd $SYNC_DIR
if [ $CRYPT = "yes" ]
then
KEY=`cat "$PASSDIR""$PASSFILE"`
echo "Archive is Encrypted"
nice -19 $DAR_BIN -K bf:$KEY -s $ARCHIVESIZE -z$COMPRESS -Z "*.gz" -Z "*.zip"\
-Z "*.bz2" -Z "*.tgz" -Z "*.zgz" -Z "*.jar" -Z "*.tiff" \
-Z "*.jpg" -Z "*.png" -Z "*.gif" -Z "*.jpeg" -R `pwd` \
-c "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F" -Q
else
echo "Archive is NOT Encrypted!!!"
nice -19 $DAR_BIN -s $ARCHIVESIZE -z$COMPRESS -Z "*.gz" -Z "*.zip"\
-Z "*.bz2" -Z "*.tgz" -Z "*.zgz" -Z "*.jar" -Z "*.tiff" \
-Z "*.jpg" -Z "*.png" -Z "*.gif" -Z "*.jpeg" -R `pwd` \
-c "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F" -Q
fi
if [ "$?" -ne "0" ]
then
echo
echo "Dar had a problem!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Archive Created successfully"
echo
# Create MD5 Checksums to verify archives after writing to media or network transfers
cd $ARCHIVEDIR
FILENAME=`ls -A "$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F"*`
if [ -e $FILENAME ]
then
echo "Create MD5 Checksum for $FILENAME"
$MD5SUM_BIN -b $FILENAME > "$FILENAME".md5
if [ "$?" -ne "0" ]
then
echo
echo "MD5 Checksum failed!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo
echo "MD5 Checksum Created successfully"
echo
fi
else
echo "$FILENAME not found!"
echo "This should not happen"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi
# DRCP Section. To scp newly created archives to a remote system
if [ $DRCP = "yes" ]
then
CPNAME=`ls -A "$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F"*`
echo "copy archive to $REMOTEHOST" remote directory $REMOTEDIR
scp -i /root/.ssh/id_rsa $CPNAME "$SSHUSER"@"$REMOTEHOST":"$REMOTEDIR"
if [ "$?" -ne "0" ]
then
echo
echo "Error copying archive and checksum to $REMOTEHOST"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi
fi

# over view of all the files which where backed up
echo
echo "Create file listing from archive"
if [ $CRYPT = "yes" ]
then
KEY=`cat "$PASSDIR""$PASSFILE"`
nice -19 $DAR_BIN -K bf:$KEY -l "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F" -Q\
> "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt && gzip -9 "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt
else
nice -19 $DAR_BIN -l "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_F" -Q\
> "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt && gzip -9 "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt
fi
# Script Timer
STOPTIME=(`date +%s`)
RUNTIME=$(expr $STOPTIME \- $STARTTIME)
hours=$(($RUNTIME / 3600))
seconds=$(($RUNTIME  % 3600))
minutes=$(($RUNTIME  / 60))
seconds=$(($RUNTIME  % 60))
echo
echo "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
echo "Full Zimbra Backup ended at: `date +%H:%M`"
echo "Backup took Hr:$hours Min:$minutes Sec:$seconds to complete"
echo ":::::::::::::::::Cheers Osoffice for the script:::::::::::::::::::::::"
(cat $LOG; $UUENCODE "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt.gz "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt.gz) | mail -c $EMAILCC \
-s "Zimbra Full Backup Log on `hostname --fqdn`" $EMAIL
echo
;;

-d | --diff)
echo
echo "      Diff Backup started at: `date +%H:%M`"

DAR_BIN=`whereis dar | awk '{print $2}'`
if [ ! -e "$DAR_BIN" ]
then
echo "Please install "dar"!"
echo "Try running the script with --INSTALL"
exit 1
fi

MAILX=`whereis mailx | awk '{print $2}'`
if [ ! -e "$MAILX" ]
then
echo "mailx is not installed!"
echo "Try running the script with --INSTALL"
exit 1
fi

RSYNC_BIN=`whereis rsync | awk '{print $2}'`
if [ ! -f "$RSYNC_BIN" ]
then
echo $SYNC_BIN
echo "Please install "rsync"!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

SSH_BIN=`whereis ssh | awk '{print $2}'`
if [ ! -e "$SSH_BIN" ]
then
echo "Please install "ssh"!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

MD5SUM_BIN=`whereis md5sum | awk '{print $2}'`
if [ ! -e "$MD5SUM_BIN" ]
then
echo "Please install "md5sum"!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $ZM_HOME ]
then
echo "$ZM_HOME not found!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $SYNC_DIR ]
then
echo "$SYNC_DIR not found!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $ARCHIVEDIR ]
then
echo "$ARCHIVEDIR not found!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi

if [ ! -d $TOO_MEDIA_DIR ]
then
echo "directory $TOO_MEDIA_DIR not found!"
echo "Try running the script with --INSTALL"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
echo
exit 1
fi

CURRENTNAME2=`ls -A -1 "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D"*dar 2> /dev/null | head -qn1`
CURRENTFULL=`ls -A -1 "$ARCHIVEDIR""$BACKUPWEEK"*FULL*dar 2>/dev/null | cut -d . -f1 `

if [ -f "$CURRENTNAME2" ]
then
echo "Full Zimbra Backup failed! FOUND A BACKUP WITH SAME NAME"
echo "Please check why! You should only run this script once a day with the current backup date settings!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
elif [ $CURRENTFULL ]
then
echo
# HotSync to backup directory
echo "Doing a hotsync of $ZM_HOME to $SYNC_DIR"
nice -19 $RSYNC_BIN $RSYNC_OPTS $ZM_HOME $SYNC_DIR
if [ "$?" -ne "0" ]
then
echo
echo "rsync had threw an hotsync error this is not that wild... continuing"
#cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
else
echo
echo "sync went ok"
fi

echo

# Stopping Zimbra
echo "Stopping the Zimbra server"
echo

#Disable zimbra user's crontab, we don't want it starting any jobs while we backup
crontab -u $ZM_USER -l > "$ZM_HOME"crontab.org
if [ "$?" -ne "0" ]
then
echo "could not backup "$ZM_USER"'s crontab..."
echo "continuing with out changing users crontab!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
touch "$ZM_HOME"crontab.blank
crontab -u $ZM_USER "$ZM_HOME"crontab.blank
rm "$ZM_HOME"crontab.blank
echo "Deactivated "$ZM_USER"'s cronjobs"
echo
fi

#Starting 'service downtime' counter
DOWNTIMEA=(`date +%s`)

su - $ZM_USER -c $ZM_HOME"bin/zmcontrol stop"
if [ "$?" -eq "1" ]
then
echo "zmcontrol shutdown had an error!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo
echo "Zimbra server has stopped "
fi
echo
# Some times I still have zimbra procs running, so I murder them! :-O
sleep 5
echo "kill any left over $ZM_USER procs"
PROX=(`ps -u $ZM_USER | awk '{print $1}' | grep -v PID`)
if [ "$PROX" ]
then
ps -u $ZM_USER | awk '{print $1}' | grep -v PID | xargs kill -s 15
echo "Did a Mr. Bush on some left over procs..."
echo
else
echo "Nothing to kill"
echo
fi
# ColdSyncing the zimbra server
echo "Doing a fast cold sync..."

$RSYNC_BIN $RSYNC_OPTS $ZM_HOME $SYNC_DIR
if [ "$?" -ne "0" ]
then
echo "rsync had threw an error!"
echo "This should not happen at this stage... exiting!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "sync went ok"
fi
echo

# Starting the Zimbra server again

#Reinstate zimbra user's crontab
crontab -u $ZM_USER "$ZM_HOME"crontab.org
if [ "$?" -ne "0" ]
then
echo "!!Could not reinstate "$ZM_USER"'s crontab!!"
echo "Please do this manually!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Reinstated "$ZM_USER"'s cronjobs"
echo
fi

su - "$ZM_USER" -c $ZM_HOME"bin/zmcontrol start"
if [ "$?" -ne "0" ]
then
echo "There was an error starting Zimbra!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo
echo "Zimbra has started"
fi
# Service Timerc
DOWNTIMEB=(`date +%s`)
RUNTIME=$(expr $DOWNTIMEB \- $DOWNTIMEA)
hours=$(($RUNTIME / 3600))
seconds=$(($RUNTIME  % 3600))
minutes=$(($RUNTIME  / 60))
seconds=$(($RUNTIME  % 60))
echo
echo "Service down time was - Hr:$hours Min:$minutes Sec:$seconds"
echo

# Hack to start the stats component
if [ $STATHACK = "yes" ]
then
echo "Running A hack... This one to check and start Stats subsystem"
#Checking if Stats is running
sleep 5
STAT_CK=(`su - "$ZM_USER" -c $ZM_HOME"bin/zmcontrol status" |grep -i stats | awk '{print $2}'`)
if [ "$STAT_CK" = "Stopped" ]
then
echo "Stats is not running, thus booting Stats subsystem!"
echo
# Stopping Stats
su - $ZM_USER -c $ZM_HOME"bin/zmstatctl stop"
if [ "$?" -ne "0" ]
then
echo "Stopping stats failed!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Stats have been stopped"
echo
fi

# Running Stats cronjob zmlogprocess manually
su - $ZM_USER -c $ZM_HOME"libexec/zmlogprocess" > /tmp/logprocess.out 2>&1
if [ "$?" -ne "0" ]
then
echo "Error running 'logprocess'"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Logprocess done..."
echo
fi

# Running Stats cronjob zmqueuelog manually
su - $ZM_USER -c $ZM_HOME"libexec/zmqueuelog"
if [ "$?" -ne "0" ]
then
echo "Error running 'libexec/zmqueuelog'"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "zmqueuelog done..."
echo
fi

# Starting Stats
sleep 2
su - "$ZM_USER" -c $ZM_HOME"bin/zmstatctl start"
if [ "$?" -ne "0" ]
then
echo "Starting stats failed!"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Stats started..."
fi
else
echo "Hack not needed Stats seems to be running fine..."
fi
fi

# Status Check to see that is running
STATUS=(`su - "$ZM_USER" -c "/opt/zimbra/bin/zmcontrol status" | grep -i Stopped`)
if [ "$STATUS" ]
then
echo
echo "Services that are not running"
echo $STATUS
cat $LOG | mail -c $EMAILCC -s "Zimbra Services Stopped on `hostname --fqdn`" $EMAIL
else
echo
echo "All services are running"
echo
fi
echo

echo "Writing a diff backup called:"
echo "      $BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D"
echo "in: $ARCHIVEDIR with file sizes of max: $ARCHIVESIZE"
cd $SYNC_DIR
if [ $CRYPT = "yes" ]
then
KEY=`cat "$PASSDIR""$PASSFILE"`
echo "Archive is Encrypted"
nice -19 $DAR_BIN -J bf:$KEY -s $ARCHIVESIZE -z$COMPRESS -Z "*.gz" -Z "*.zip"\
-Z "*.bz2" -Z "*.tgz" -Z "*.zgz" -Z "*.jar" -Z "*.tiff" \
-Z "*.jpg" -Z "*.png" -Z "*.gif" -Z "*.jpeg" -R `pwd` \
-c "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D" -Q\
-A "$CURRENTFULL" -Q
else
echo "Archive is NOT Encrypted!!!"
nice -19 $DAR_BIN -s $ARCHIVESIZE -z$COMPRESS -Z "*.gz" -Z "*.zip"\
-Z "*.bz2" -Z "*.tgz" -Z "*.zgz" -Z "*.jar" -Z "*.tiff" \
-Z "*.jpg" -Z "*.png" -Z "*.gif" -Z "*.jpeg" -R `pwd` \
-c "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D" -Q\
-A "$CURRENTFULL" -Q
fi
if [ "$?" -ne "0" ]
then
echo
echo "Dar had a problem!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo "Archive Created successfully"
echo
# Create MD5 Checksums to verify archives after writing to media or network transfers
cd $ARCHIVEDIR
FILENAME=`ls -A "$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D"*`
if [ -e $FILENAME ]
then
echo "Create MD5 Checksum for $FILENAME"
$MD5SUM_BIN -b $FILENAME > "$FILENAME".md5
if [ "$?" -ne "0" ]
then
echo
echo "MD5 Checksum failed!"
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
else
echo
echo "MD5 Checksum Created successfully"
echo
fi
else
echo "$FILENAME not found!"
echo "This should not happen"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi
# DRCP Section. To scp newly created archives to a remote system
if [ $DRCP = "yes" ]
then
CPNAME=`ls -A "$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D"*`
echo "copy archive to $REMOTEHOST" remote directory $REMOTEDIR
scp -i /root/.ssh/id_rsa $CPNAME "$SSHUSER"@"$REMOTEHOST":"$REMOTEDIR"
if [ "$?" -ne "0" ]
then
echo
echo "Error copying archive and checksum to $REMOTEHOST"
echo
cat $LOG | mail -c $EMAILCC -s "Zimbra backup error on `hostname --fqdn`" $EMAIL
exit 1
fi
fi
fi

# over view of all the files which where backed up
echo
echo "Create file listing from archive"
if [ $CRYPT = "yes" ]
then
KEY=`cat "$PASSDIR""$PASSFILE"`
nice -19 $DAR_BIN -K bf:$KEY -l "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D" -Q\
> "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt && gzip -9 "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt
else
nice -19 $DAR_BIN -l "$ARCHIVEDIR""$BACKUPWEEK"_"$BACKUPNAME"_"$BACKUPDATE"_"$BACKUPTYPE_D" -Q\
> "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt && gzip -9 "$ARCHIVEDIR"Backuplist-"$BACKUPDATE".txt
fi
# Script Timer
STOPTIME=(`date +%s`)
RUNTIME=$(expr $STOPTIME \- $STARTTIME)
hours=$(($RUNTIME / 3600))
seconds=$(($RUNTIME  % 3600))
minutes=$(($RUNTIME  / 60))
seconds=$(($RUNTIME  % 60))
echo
echo "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
echo "Diff Zimbra Backup ended at: `date +%H:%M`"
echo "Backup took Hr:$hours Min:$minutes Sec:$seconds to complete"
echo ":::::::::::::::Cheers Osoffice for the script:::::::::::::::::::::::::"
echo
;;

*)
echo
echo "use -h or --help for assistance"
echo
;;

esac
exit 0
 

Установка и настройка Zimbra CS OSE в Debian

Written by Valor on Ноябрь 22nd, 2009

zimbra_logo

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

  • Бесплатность (свабода).
  • Приемлемый уровень локализации.
  • Функциональный вэб интерфейс.
  • Хотя бы зачатки CRM.
  • Безопасность.
  • Производительность.
  • Высокая скорость работы с почтовыми ящиками очень большого размера.

Учитывая все эти требования я принялся бороздить просторы интернета в поисках чего-то похожего. Перебрав несколько более или менее подходящих экземпляров я честно говоря впал в отчаянье. Не один из них не подпадал даже под половину требований.. Среди них были и OpenExchange, Phpgroupware и некоторые другие, в каждом из них как на зло находились весьма досадные недостатки которые напрочь исключали возможность их использования. Но тем не менее задача требовала решения и поиск продолжался пока я случайно не наткнулся на сайт zimbra.com. Представленный там продукт при детальном рассмотрении соответствовал 90% требований (в OSE варианте по сей день нету вменяемых инструментов для резервного копирования). Не смотря на некоторые недостатки, список достоинств был весьма внушителен, что не могло не радовать. И так вооружившись wget`ом и xen я приступил к первичному осмотру. Результатом которого является успешная эксплуатация сей системы в течении 2 лет.
В данной статье я постараюсь провести краткий ликбез по Zimbra CS OSE о процессе ее установки и настройки. Click to continue »

 

Gnome-shell – In action

Written by Valor on Ноябрь 5th, 2009

GNOME2

Gnome Sell. Новое лицо грядущего Gnome 3. Грянет он еще нескоро, аж в начале 2010 года, но посмотреть на это самое лицо можно уже сейчас. Click to continue »

 

Сборка ядра в Debian (Мануал № 1001)

Written by Valor on Октябрь 27th, 2009

debian-logo

Сборка ядра в Debian.

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

Для особо не понятливых обозначу моменты когда ручная сборка ядра действительно оправдана.

1. Померятся пиписьками с друзьями (мол у кого ядро свежее у того длиннее)
2. В вашем супер компьютере есть особо уникальное железо, поддержка которого появилась только в самом свежим ядре, а ждать пока оно появится в репозитории нету мочи.
3. У Вас особо пытливый ум и руки вечно чешутся в предвкушении чего нить поковырять. В общем есть неукротимое желание получше/ поближе познакомится с внутренним миром Linux.
4. Бесконечная тяга ко всякого рода оптимизациям. Хочется форсировать свое ядро до состояния мгновенной загрузки путем выкидывания из его состава всего на хрен ненужного.
5. Больная голова рукам покоя не дает.
6. Додумайте сами…..

Случаи когда ручная сборка блажь и потеря времени.
1. Система относительно статична, железо меняется редко и оно достаточно распространено дабы иметь поддержку в репозиторных ядрах.
2. Целевая система «боевой» сервер. В данном случае мнения могут расходится, я же считаю, что официальных фиксов вполне хватает, благо в Debian они выходят достаточно оперативно (В зависимости от степени критичности найденной уязвимости или бага). Но есть и исключения.
3. Случаи противоречащие мотивирующим фактором (см. Первые 6 пунктов).

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

И так приступим.

1. Для начала качаем последний стабильный релиз ядра с kernel.org (Внимание для тех у кого лимитированный интернет! Размер архива с исходным кодом ядра, примерно 55-60 Mb ) и установим необходимые для сборки пакеты.

1
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential

2. Создаем директорию где будем собирать наше «ванильное ядро». Рекомендуют делать это в /usr/local/src, я же советую сделать директорию home/${USER}/srс. В созданную директорию копируем скаченный архив с исходными кодами ядра.

3. Далее распаковываем его.

1
tar -xvf ./linux-2.6.31.tar.bz2

4. Переходим в полученную директорию.

1
сd ./linux-2.6.31

5. Если есть необходимость накатить патчи.

1
2
bzip2 -dc ./patch.bz2 | patch -p1 --dry-run
bzip2 -dc ./patch.bz2 | patch -p1

6. Далее копируем текущий конфигурационный файл ядра.

1
make clean && make mrpropercp /boot/config-2.6.30-2-686 ./config

7. Конфигурируем ядро (если надо конечно).
Собственно самый ответственный момент во всем процессе. Сем занятием можно предаваться очень долго и в несколько подходов в зависимости от степени осознанности того, что Вы желаете получить на выходе. Настоятельно рекомендую подходить к этому процессу максимально серьезно, хотя бы ради экономии времени на повторную сборку в случае неудачи. Прежде чем что-то выключить или наоборот включить надо бы вопросить совета у всезнающего google.com или вызвать контекстную справку нажатием клавиши «?».

make menuconfig

По завершению конфигурации незабываем сохранить изменения.

Для пущего ускорения процесса рекомендую сделать следующее:

export CONCURRENCY_LEVEL=X – где «Х», это число ядер вашего процессора +1.

8. Далее надо собрать ядро.

1
make-kpkg clean && fakeroot make-kpkg --initrd --append-to-version=-${user} kernel_image kernel_headers

Процесс сборки займет Ваш компьютер на время от 1 часа до бесконечности :) .
Если процесс не завершится ошибкой то в итоге мы получим два .deb фала

linux-image-2.6.31-${username}_2.6.31-${username}-10.00.Custom_i386.deb – собственно само ядро.
linux-headers-2.6.31-${username}_2.6.31-${username}-10.00.Custom_i386.deb – заголовочные фалы ядра.

Разумеется их нужно проинсталлировать.

1
2
dpkg -i [ядро].deb
dpkg -i [заголовки].deb

В процессе инсталляции в Grub будет добавлен новый пункт меню с версией Вашего ядра.
Делаем reboot и грузимся под новым ядром. Скорее всего у Вас отвалится модуль ядра драйвера видео карты его нужно будет пересобрать. И я кратко опишу это действо.

Ставить мы будем бинарные драйвера от NVidia. Владельцам карт от ATI большой сори. :(

Качаем свежие драйвера для вашей видео-карты с сайта nvidia.com, будет что-то вроде этого.

NVIDIA-Linux-x86-185.18.36-pkg1.run – сей драйвер для 7 серии видео-карт.

Ну а дальше все просто.

Жмем Ctrl+Alt+F1

/etc/init.d/gdm stop -Нужно это в случае если на системе стоял X сервер (графическая оболочка) который после перезагрузки заявит вам об ошибке в работе драйвера, предварительно несколько раз мигнув дисплеем в тщетной попытке запуститься.

Переходим в директорию с фалом драйвера и запускаем его..

1
sh ./NVIDIA-Linux-x86-185.18.36-pkg1.run

Дополнительные параметры запуска можно посмотреть запустив драйвер с ключом -h

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

После того как все будет завершено запускаем gdm командой /etc/init.d/gdm start

Ну вот вроде и все.

С радостью отвечу на вопросы.