archlinux

Automatinis laiškų persiuntimas į Trac

Pradėjęs naudoti Archlinux taip pat radau ir naują įrankį laiškų parsiuntimui: fdm. Jis man pasirodė kur kas paprastesnis, nei fetchmail ir net gi turintis daugiau reikalingų funkcijų. Dėl tam tikrų funkcijų atsisakiau ir procmail, nes fdm gali puikiausiai atlikti ir procmail funkciją... :)

Kitas dalykas, jei dirbate su kokiais nors projektais, tai tikriausiai gaunate daug laiškų, kuriuos perskirstote ir talpinate į kokią nors Web pagrindu veikiančią projektų ar užduočių valdymo sistemą. Na, bent jau aš dirbu panašiai taip, kaip apibūdinau ir visai nesenai, mano kolega paklausė, ar įmanoma, kaip nors tuos laiškus persiųsti tiesiai į užduočių valdymo sistemą, kad ji iš to laiško sukurtų naują užduoti. Pagalvojau, kad tai tikrai puiki mintis. Tačiau paieškojęs internete neradau jokių panašių realizacijų, Trac sistemai, kurią naudojuosi.

Bet, pasirodo, kad tokį dalyką padaryti, įtraukiant į darbą fdm ir šiek tiek Python kodo, yra visiškai nesudėtinga.

Štai ką aš dariau, kad atsirastų galimybė persiųsti laišką tiesiai į Trac sistemą, kaip naują užduotį.

Testinės Trac aplinkos diegimas.

Kadangi nenorėjau žaisti su veikiančiai sistemą, susikūriau atskirą aplinką testavimams:

  1. # Įdiegiau Python paketų valdymo įrankį easy_install į Archlinuxą:
  2. sudo pacman -S setuptools
  3.  
  4. # Įdiegiau Python virtualios aplinkos kūrimo įrankį:
  5. sudo easy_install virtualenv
  6.  
  7. # Susikūriau virtualią aplinką Trac programai:
  8. cd ~/www/sandbox
  9. virtualenv trac
  10.  
  11. # Aktyvavau virtualią aplinką esamame shelle:
  12. cd trac
  13. source bin/activate
  14.  
  15. # Įdiegiau Trac į virtualią aplinką:
  16. easy_install trac
  17.  
  18. # Susikūriau testinį Trac instancą:
  19. trac-admin test initenv
  20. trac-admin test permission add anonymous TRAC_ADMIN
  21.  
  22. # Paleidau Trac sistemą:
  23. tracd --port 8000 test
  24.  
  25. # Atsidariau paleistą Trac interneto naršyklėje:
  26. firefox http://localhost:8000/test

fdm konfigūravimas

Sekantis žingsnis fdm konfigūravimas ir štai, kaip turėtu atrodyti failo ~/.fdm.conf turinys:

  1. action "newticket" pipe "%h/www/sandbox/trac/mailpipe.py"
  2. account "stdin" disabled stdin
  3. match "(To|Cc):.*trac@localhost" action "newticket"

Pagal šią konfigūraciją, fdm, visus laiškus su trac@localhost perduos Python scriptui, kuris sukurs naują ticketą Track užduočių sistemoje.

Python skriptas naujų užduočių kūrimui

Tai sunkiausia dalis, nes Trac sistema, apsaugai nuo spamo naudoja visokius parametrus, todėl reikia iš pradžių nuskaityti naujo užduoties įvedimo formą, kurios užkrovimo metu sukuriama sesija ir tam tikri sausainiukai. Tada iš tos formos reikia pasiimti specialų kintamąjį, kuris nurodo, kad formos duomenys buvo išsiūsti iš ten kur reikia. Ir galiausiai reikia išsiūsti reikiamus duomenis, kad būti sukurta nauja užduotis.

Šioje vietoje nedariau jokios naudotojų autentifikacijos, bet tai nesunku prijungti, esant poreikiui.

Jei kam įdomu, tai aiškindamasis ką reikia perduoti Trac sistemai, panaudojau puikų Web debuginimo proxį burpsuite. Archlinux sistemoje jį galima įsidiegti iš nuostabiojo AUR:

  1. yaourt -S burpsuite

Štai Python scriptas, kuris daro visą darbą (atkreipkite dėmesį, kad šis skriptas parašytas Python 3.0 versijai, todėl su senesne neveiks):

  1. #!/usr/bin/env python3
  2. """This is pipe script for fdm.
  3. """
  4.  
  5. import sys
  6. import email
  7. import urllib.parse
  8. import urllib.request
  9. import http.cookiejar
  10. from html.parser import HTMLParser
  11.  
  12. class InputFieldsParser(HTMLParser):
  13. """Parse all input fields from given html string.
  14. """
  15. fields = {}
  16.  
  17. def handle_starttag(self, tag, attrs):
  18. if tag == 'input':
  19. attrs = dict(attrs)
  20. if 'name' in attrs and 'value' in attrs:
  21. self.fields[attrs['name']] = attrs['value']
  22.  
  23. def get_html_fields(html):
  24. """Returns all input fields from given html string.
  25. """
  26. parser = InputFieldsParser()
  27. parser.feed(html)
  28. parser.close()
  29. return parser.fields
  30.  
  31. def get_url_opener():
  32. """Returns urllib OpenerDirector for sending correct request...
  33.  
  34. This openner acts like a web browser with Mozilla user agent and cookies
  35. support.
  36. """
  37. cj = http.cookiejar.CookieJar()
  38. cookie_processor = urllib.request.HTTPCookieProcessor(cj)
  39. opener = urllib.request.build_opener(cookie_processor)
  40. opener.addheaders = [('User-agent', 'Mozilla/5.0')]
  41. return opener
  42.  
  43. def submet_to_trac(title, body):
  44. """Function to submit new ticket to Trac system.
  45. """
  46. params = {
  47. 'author': 'anonymous',
  48. 'field_summary': title,
  49. 'field_reporter': 'anonymous',
  50. 'field_description': body,
  51. 'field_type': 'defect',
  52. 'field_priority': 'major',
  53. 'field_milestone': '',
  54. 'field_component': 'component1',
  55. 'field_version': '',
  56. 'field_keywords': '',
  57. 'field_cc': '',
  58. 'field_owner': '',
  59. 'field_status': 'new',
  60. 'submit': 'Create+ticket',
  61. }
  62.  
  63. opener = get_url_opener()
  64. url = 'http://localhost:8000/test/newticket'
  65. fields = get_html_fields(str(opener.open(url).read()))
  66. params['__FORM_TOKEN'] = fields['__FORM_TOKEN']
  67. params = urllib.parse.urlencode(params)
  68. f = opener.open("http://localhost:8000/test/newticket", params)
  69. f.read()
  70.  
  71.  
  72. def submit(title, body):
  73. """Does all submission job to a web page form.
  74. """
  75.  
  76. # Create new functions and change this line,
  77. # for support to other systems.
  78. submet_to_trac(title, body)
  79.  
  80.  
  81. def get_message_body(msg):
  82. """Returns email message body.
  83.  
  84. Only text/plain message parts are supported.
  85. """
  86. for part in msg.walk():
  87. if part.get_content_type() == 'text/plain':
  88. return part.get_payload()
  89.  
  90. return ''
  91.  
  92.  
  93. def main():
  94. """The main function of this script.
  95. """
  96. msg = email.message_from_file(sys.stdin)
  97. title = msg.get('subject')
  98. body = get_message_body(msg)
  99. submit(title, body)
  100.  
  101.  
  102. if __name__ == '__main__':
  103. main()

Testavimas

Galiausiai viską sujungus į vieną vietą galima pradėti testuoti. Kad nereikėtų siuntinėti laiškų į kažkokius serverius, tai tam reikalui paprasčiausiai susikūriau laišką ir išsaugojau jį į failą. Štai laiško turinys:

  1. From: sirex@localhost
  2. To: trac@localhost
  3. Subject: Testinė užduotis.
  4.  
  5. Testinė užduotis Trac sistemai.

O štai komanda, kurios pagalba laiškas perduodamas fdm programai, kuri patikrina laiško headerius, pritaiko reikiamą veiksmą ir perduodą Python scriptui, kuris paverčia laiško turinį į naują Trac užduotį:

  1. cat newmail | fdm -vma stdin fetch

Pabaigai

Jei visi testavimai praeina sėkmingai, tai belieka susikurti pašto dėžutę į kurią sunčiami laiškai, automatiškai bus paverčiami Trac sistemos užduotimis. Žinoma reikės atitinkamai pakeisti fdm konfigūraciją, kad laiškai būtų imami ne iš stdin, o iš naujai susikurtos pašto dėžutės.

Mano, daugiau/mažiau nusistovėjusi Archlinux konfigūracija

Jau praėjo daugiau kaip savaitė, kaip naudoju Archlinux. Per tą laiką spėjau visiškai pilnai sukonfigūruoti sistemą ir pritaikyti savo poreikiams. Anksčiau esu rašęs įrašą apie tai, kokias programas naudoju. Tačiau tai buvo Ubuntu ir jau praėjo lygiai 1 metai ir 5 dienos. Todėl sugalvojau tokią apžvalgą padaryti naujai.

Pradžiai, štai kaip atrodo dabartinis mano darbo laukas:

Trumpas pasirinktų paketų/programų sąrašas:

Operacinė sistema
Archlinux
Login menedžeris
SLiM
Darbo aplinka
Fluxbox
Tema: bora_black
Klaviatūros išdėstymas
LEKPa
Shell'as
zsh
Terminalo emuliatorius
xterm + screen
Šriftas: Terminus
Spalvos: Zenburn
System monitor
conky
Network Manager
Wicd
File Manager
Thunar
Paveiksliukų peržiūra
GQView
Interneto naršyklė
Firefox, Opera
El. paštas
MUA: mutt
MTA: msmtp
MRA, MDA: fdm
Biff: mail-notification
FTP
lftp
RSS
newsbeuter
Paketų valdymo sistema
pacman, yaourt
Mirror: atviras.lt/archmirror
Teksto redaktorius
vim
Spalvos: Zenburn
IM
Gajim
IRC
irssi
Muzika
mpd
Klientas: mpc
Valdymas: ~/.fluxbox/keys + mpc
last.fm: lastfmsubmitd + lastmp

Pažintis su Archlinux

Kokią savaitę prieš naujuosius metus, įkvėptas ubuntu.lt forumo temos apie Archlinux, nusprendžiau ir pats išbandyti Archlinux!

Labiausiai sudomino tai, kad jis labai greitas, bent jau taip pavaizduota YouTubėje: How fast is Arch Linux? Užsikabinęs, nusprendžiau pasidomėti plačiau ir radau dar daugiau įdomių savybių:

Prieš naujuosius dar visą savaitę skaitinėjau, kas ir kaip, o po naujųjų, visas išeigines dienas pašvenčiau Archlinux bandymams. Pirmiausiai išbandžiau jį įdiegdamas į vmware virtualią mašiną, viskas suveikė gan sklandžia, tai greitai tą patį padariau ir ant savo kompiuterio.

Bendras įspūdis

Kažkaip nepastebėjau labai didelio greičio skirtumo, lyginant su Ubuntu. Bendras visų programų veikimo ir pasileidimo greitis yra daug maž vienodas, tačiau kai kurios programos vis tik pradėjo veikti žymiai greičiau. Labiausiai tai matyti su mutt, kuris su 10 tūkstančių laiškų užsikrauna kokius 3 kartus greičiau nei anksčiau. Tuo tarpu Firefox užsikrauna taip pat lėtai kaip ir anksčiau, gal keliomis sekundėmis ir greičiau, neskaičiavau, bet aiškaus pagreitėjimo nematyti. Gal būt tas pagreitėjimas labiau jaučiasi naudojant KDE su KDEmod...

Lyginant su Ubuntu, Archlinux yra ganėtinai nestabilus, dažnai teko susidurti su visokiomis problemomis ir bugais. Mano kompiuterio geležis yra puikiai suderinama su Linux branduoliu, todėl Ubuntu, po 20 minučių trukusio diegimo veikia tiesiog Out of The Box. Tuo tarpu Archlinux diegimas ir konfigūravimas užtruko 3 dienas (ko gero konfigūravimas dar nesibaigė ir greitai nesibaigs, tobulumui nėra ribų :) ). Bet kokiu atveju, diegti Archlinux buvo tikrai įdomu ir apturėjau daug malonumo... :)

Kas patiko

Rolling release
Ko gero vienas iš labiausiai patikusių dalykų yra tai, kad Archlinux repozitoriumuose galima rasti pačias naujausias programų versijas iš karto po jų išleidimo. Žinomo toks gėris kainuoja tai, kad neretai programos būna ne iki galo ištestuotos. Bet, bent kiek labiau patyrusiam kompiuterio naudotojui tai neturėtų būti problema.

KISS
Paprastumo principas Archlinux sistemoje pasireiškia tuo, kad pateikiama labai paprasta sistema, kurią, praktiškai nuo nulio turi susikonfigūruoti pats, taip kaip nori.

Didžiausias gėris yra tame, kad pats savo rankomis statydamas tokią sistemą, turi galimybę iš pagrindų susipažinti su pačia sistema ir tuo, kaip ji veikia. Tai ne tik praturtina žiniomis, bet ir atsitikus kokiai nors nelaimei, bent jau bus daugiau/mažiau aišku ką ir kur žiūrėti.

Bet to, pati visos sistemos struktūra yra visiškai paprasta, todėl jautiesi taip, lyg iš tikrųjų, pats valdai sistemą nuo A iki Z.

Arch is text-based and command-line oriented
Jau senai esu įpratęs daugelį visų veiksmų atlikti komandinėje eilutėje, žinant vos kelias komandas ir nesivarginant kiekvienam menkniekiui ieškoti, kažkokio automatizuoto grafinio įrankio. Archlinux tikrai yra visiškai command-line friendly... :)

Bet to, diegimo meto, kol sukonfigūruojama grafinė aplinka, reikia nemažai padirbėti visiškai tekstiniame režime. Todėl gerai susikonfigūravau ne tik grafinę aplinką, bet ir tekstinio režimo daly, be grafinės aplinkos. Grub meniu yra net gi du punktas, vienas – paleisti su grafine aplinka, kitas, be grafinės aplinkos... :)

AUR
Ganėtinai įdomus pasirodė paketų vystymo procesas. AUR yra toks paketų repozitoriumas, kur pateikiami Archlinux naudotojų source paketai, kuriuos gali parsisiųsti ir pats susikompiliuoti, patikrindamas ar viskas gerai. Kompiliavimo procesas, naudojant Yaourt yra visiškai automatizuotas ir labai paprastas. Po kompiliavimo, jei paketas sudarytas gerai ir veikia puikiai, galima balsuoti už tą paketą, kad jis iš AUR, butų perkeltas į Community repozitoriumą ir įgytų patikimo paketo statusą.

Gal būt ir yra šioks toks pavojus dėl kokių nors nepatikimų paketų, bet vis tik, mano manymų, tai yra puikiai sumanyta paketų vystymo sistema.

Kita...
Kol kas Archlinux naudoju vos kelias dienas, todėl manau, kad bus dar daug gerų dalykų. Kol kas nebandžiau ABS ir tikriausiai dar daugiau įdomių dalykų.

Problemos

Aprašysiu konkrečias problemas, su kuriomis susidūriau.

LiveCD bugas
Nelaimės prasidėjo nuo livecd. Iš pradžių parsisiunčiau oficialų archlinux-2008.06-core-i686 livecd. Tačiau paleisti iš jo live sistemos taip ir nepavyko. Pamaniau, kad problema pačiame CD, bandžiau įrašyti tą livecd atvaizdą gal kokius 10 į skirtingus CD visokiais greičiais ir visokiais būdais, kol galiausiai išsiaiškinau, kad tai yra senas bugas. Teko siųstis neoficialų archlinux-2008.12-archboot CD atvaizdą, kuris turi ISOLINUX boot loaderį ir kuris pasileido sėkmingai.

cfdisk problema
Įpusėjus diegimą susidūriau su disko skaldymo problema, nes cfdisk pareiškė, kad mano extention dalyje esantis disko skirsnis viršija patį extenteion skirsnio dydį, kuriame jis yra. Ir dėl to cfdisk paprasčiausiai nepasileido visai. Nežinau kaip tai nutiko, bet fdisk -l tikrai patvirtino, tai, ką pasakė cfdisk. Laimei su fdisk pavyko sutvarkyti disko skirsnius, nežiūrint į nesklandumą su extention dalies perviršiu.

XDM taip ir nepavyko paleisti
Kadangi buvau apsisprendęs naudoti Fluxbox, tai kaip login managerį pasirinkau XDM, kuris bent jau Archlinux wikyje siūlomas pagal nutylėjimą. Tačiau jo paleisti taip ir nepavyko. Išsiaiškinau tik tiek, kad problema susijusi su hal, į kurį XDM dėl kažkokių priežasčių nesėkmingai bando kreiptis. hal demonas paleistas prieš XDM, todėl įtariau, kad problema slypi pačiame XDM. Galiausiai įdiegiau kitą login managerį slim ir problemos baigėsi.

Problemos su paketų priklausomybėmis (dependencies)
Nežinau ar tai paketų priklausomybių problema ar pačių paketų problema, bet susidūriau su tokiomis problemomis, kaip mime types failų nesugeneravimas, reikalingų piktogramų neparsiuntimas ir pan. Konkrečiai dėl mime tipų failų nesugeneravimo, nepasileido kai kurios programos, kurios tai naudoja, nes paprasčiausiai tos programos negalėjo užkrauti paveiksliukų, dėl mime types informacijos nebuvimo.

Bet kokiu atveju, savarankiškai įdiegus kažkokį tai paketą, mime types problema išsisprendė, tačiau kai kurių piktogramų nerodo iki šiol.

Kitos problemos
Susidūriau su visa eile kitų problemų, kurios atsirado ne dėl kokios nors Archlinux kaltės, o paprasčiausiai todėl, kad daug dalykų reikia daryti rankiniu būdu, todėl reikia labai gerai įsiskaityti į taip, kaip viskas veikia, kad nepadarytum kokios nors klaidos.

Surinktas turinys