01.10.2010

Выкарыстанне “make” для абслугоўвання файлаў Postfix

Original on unixwiz.net

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

АЛЕ – гэта не падручнік па карыстанні Postfix, пагэтаму ен не прызначаны для забеспячэння рады пра канфігурацыю. Тут гаворка ідзе вылучна пра тое, як кіраваць канфігурацыяй, што вы выбралі па сваім меркаванні.

Будаўніцтва. Db файлы з тэкставых файлаў

Postfix main.cf файл канфігурацыі можа паказаць месцазнаходжанне некалькіх дробных файлаў (“карты”):

virtual_alias_maps = 
  hash:/etc/postfix/virtual 
transport_maps = 
  hash:/etc/postfix/transport 
relay_domains = 
  $mydestination, 
  $mydomain, 
  hash:/etc/postfix/relays 
... 

і гэтак далей. Гэтыя “непатрэбныя” карты, што прадстаўлены ў фармаце Berkeley DB (Існуюць і іншыя фарматы карт, але тут мы не займаемся іх вывучэннем). Файлы захоўваюцца ў звычайным тэкставым фармаце, а затым пераходзяць у фармат bd з камандай postmap, якую падае Postfix.

Будаўніцтва любога файла карты праходзіць досыць проста, і мы будзем выкарыстоўваць файл transport у якасці прыкладу:

# cd /etc/postfix 
# vi transport 
example.com    smtp:[mail.example.com]:25 
... 
# ls -l transport* 
-rw-r--r-- 1 root  root   7292 Nov 30 2002 transport 
# postmap transport  creates "transport.db" from "transport" 
# ls -l transport* 
-rw-r--r-- 1 root  root   7292 Nov 30 2002 transport 
-rw-r--r-- 1 root  root  12288 Sep 26 14:24 transport.db 

Наступныя змены гэтага файла неабходна проста працуе transport каманду postmap ізноў аднавіць. Db файл.

Але бо колькасць гэтых прыкладаў. Db павялічваецца файлаў становіцца ўсё цяжэй адсочваць, якія з іх павінны быць перабудаваны пасля некалькіх змен: змены ў канфігурацыі, часцяком прымаюцца ў групах. Можна стварыць невялікі скрыпт для гэтага:

# cd /etc/postfix 
# cat rebuild-maps 
cd /etc/postfix 
newaliases    the "aliases" file is a special case 
postmap transport 
postmap relays 
postmap virtual 
... 
# chmod +x rebuild-maps 
# ./rebuild-maps 

Хоць гэта проста, але гэта каманда аднаўляе файлы, нават калі ў гэтым няма неабходнасці. Мы выкарыстоўвалі make каманды настолькі доўга, што ўжыванне яго тут пачуваецца натуральным для нас. Гэта адна з найстарых частак распрацоўкі праграмнага забеспячэння інструментара UNIX.

Будаўніцтва Makefile

“Makefile” уяўляе сабою невялікі тэкставы файл, які апісвае залежнасць стаўлення паміж рознымі файламі, а таксама інструкцыямі пра тое, як перапрацаваць мэтавыя файлы з  зыходных файлаў. Гэта менавіта тое, што мы робім тут: у прыкладзе было паказана, што “перавозка” – гэта зыходны файл, а “transport.db” з’яўляецца аб’ектным файлам.

 1: MAPS = relays.db aliases.db transport.db relocated.db \ 
 2:   virtual.db sender_checks.db rejected_recips.db \ 
 3:   helo_access.db 
 4: 
 5: all : $(MAPS) 
 6: 
 7: aliases.db : aliases 
 8: tab  newaliases 
 9: 
10: %.db : % 
11: tab  postmap $* 

Мы разгледзім гэты Makefile, хоць і не строга ў верхнім і ніжнім парадку. Мы выкарыстоўваем вылучна GNU Make – старэйшы не дазваляе ўсім часткам мець адзін і той жа сінтаксіс.

Лініі 1 .. 3

Вызначыць зменную, якая ўтрымоўвае спіс усіх файлаў з базамі дадзеных. Выкарыстанне $(MAPS) у канцы файла высылаецца на ўвесь спіс у выглядзе радка.

Лінія 5

Гэта вызначае фактычную залежнасць: “мішэнь” (улева ад двукроп’я) і усё гэта залежыць ад усяго ўправа ад двукроп’я. Гэта азначае, што запіс make патрабуе, каб усе элементы ў $(MAPS) спісе былі б зроблены ў актуальным стане.

Лініі 7 .. 8

Гэта і вызначае пэўныя правілы для стварэння мэты. Калі мэта (aliases.db) або адсутнічае, або з’яўляецца старэйшай, чым aliases, дзеянні, якія вынікаюць, выконваюцца адной камандай. Хоць большасць карт, выкарыстоўваных Postfix, будуюцца з postmap каманд, aliases.файлы – гэта адмысловы выпадак.

Лініі 10 .. 11

Гэта і вызначае агульнае правіла, якое пераўтворае простыя файлы (залежнасць) у FILE.db (мэта) увогуле выпадку, а дзеянне – гэта каманда, якая дапамагае дасягнуць гэтай мэты. Вось, гэтыя postmap каманды а $* з’яўляюцца ўбудаванай зменнай, якая адносіцца да залежнасці.

Калі make каманда выконваецца, яна знаходзіць першае мэты ў файл і выкарыстоўвае яго ў якасці агульнай мэты. У гэтым выпадку, гэта усё. Гэта не “рэальныя” мэты (у тым сэнсе, што файл фактычна ствараецца з такім іменем), але ўсе гэта толькі агульныя віртуальныя правілы.

Залежнасці ўсіх файлаў у правай частцы – элементы $(MAPS) макра – і кожны з іх праходзіць праз той жа працэс. Спіс усіх правіл праходзіць кансультацыі, а “найболей падыходныя” знаходзіцца, калі гэта магчыма. Больш пэўныя правілы заўсёды адпавядаюць меней пэўным правілам: нягледзячы на лініі 10,11 правілы могуць будаваць aliases.db з aliases з дапамогай postmap каманд, найболей пэўныя правілы прама над ім, замест яе выкарыстоўваецца.

Калі Makefile будуецца, патрэбна толкі адзінае простае рэдагаванне тэкставых файлаў па меры неабходнасці, а затым увядзенне make.

ВАЖНА – там, дзе паказваюцца укладцы, яны павінны быць сапраўднымі – выкарыстанне прабелаў не будзе эквівалентным. Хібнае выкарыстанне прабелаў замест ўкладак з’яўляецца адным з вядучых чыннікаў зламаных makefiles. Гэта невідавочна.

Падрабязней пра прынадныя кавалачкі

Мы зусім не жадалі патрапіць у бізнэс “make tutorial”, але ёсць некалькі дадатковых адзначэнняў, да якіх мы жадалі б звернуцца.

  • make праграмы з’яўляецца неабходнай умовай для самых разнастайных мэт, а не толькі для традыцыйнай ролі ў справе развіцця праграмнага забеспячэння, для якой ён быў распрацаваны. Час, адпушчаны на навучанне выкарыстанню make , верагодна, будзе згашаны па дарозе.
  • Мы выкарыстоўваем GNU make вылучна: гэта выдатная прылада са значна большвй колькасцю функцый, чым можна знайсці ў традыцыйнай версіі. Гэта партатыўная прылада (мы нават выкарыстоўваем яе для развіцця Windows), мы проста не звяртаем ніякай увагі на тое, як працуюць старыя праграмы. GNU паказвае, якая дакументацыя можа быць набыта ў GNU Press.
  • Пасля занясення змен у адным ці некалькі тэкставых файлах, справядліва спытаць, што было б пабудавана, калі б мы зараз кіравалі make. У сваю чаргу я магу сказаць толькі тое, што дабіцца поўнага кіравання ім немагчыма.

Comments are closed.