jiyuu-מחשבות פתוחות

25/07/2007 22:35 ע"י כתריאל טראום

הבלוג הזה מבוסס על אפליקצית בלוגים פשוטה אשר פיתחתי, גם מתוך עניין אישי וגם מתוך חוסר שביעות רצון מפתרונות אחרים שניסיתי. הם כולם היו או מגושמים ומנופחים מדי, או פשוטים מדי ולא ענו על הצרכים.

לכן החלטתי לכתוב את jiyuu, מנוע למערכת בלוגים. jiyuu מבוססת על php (כמובן), ו-sqlite מה שהופך אותה לפשוטה וקלה; מאין דרך אמצע בין מערכת בלוגים מבוססת mysql ומערכת מבוססת קבצים. אישית אני משתמש ב-lighttpd כשרת הווב, אבל כמובן ש-jiyuu תעבוד ללא בעיה עם Apache.
jiyuu עושה שימוש נרחב במנוע ה-Ajax המצויין xajax, מה שהופך אותה לזורמת ונוחה יותר לשימוש ממנוע בלוגים קלאסי (לדעתי כמובן, אבל אני בכלל לא משוחד).

כרגע jiyuu עדיין בשלבים מוקדמים, ולכן עוד לא העלתי קוד שלה, אשמח לשלוח במייל את הקוד למי שמבקש, שלחו לי אימייל לכתובת katriel AT traum dot org dot il.

jiyuu זמינה ותהיה זמינה תחת רשיון ה-GPL.

מי מפחד מהחושך? (ומ-Sendmail ו-LDAP?)

18/07/2007 19:51 ע"י כתריאל טראום

שנים רבות שפחדתי מ-Sendmail, באמת. הסתכלתם פעם בקובץ קונפיגורציה שלו? אם אתם אמיצים, פתחו את הקובץ sendmail.cf (משאיר לכם כתרגיל למצוא את המיקום שלו), וראו אם אתם מצליחים להבין איזה כמה שורות קונפיגורציה שם. לא, הא? טוב, אתם לא לבד, 99.999% מאוכלוסיית העולם אינה מסוגלת לקרוא את הקובץ. אבל אל דאגה, לעזרתנו באה שפת המאקרואים m4, למי שלא מכיר, תגידו שלום ל-sendmail.mc, מכיל רק כמה שורות, קצת יותר נהירות, שבעזרתם בונה המפענח (m4) את sendmail.cf.

יופי, עכשיו שהבהרנו את הנושא הזה, בוא ונסתכל על אחד מהמאפיינים של Sendmail שעושה אותו כלי מצויין (למרות שכיום, חביב עלי יותר postfix), מפות. לא, לא מפות שולחן, אלא שימוש בקבצי מיפוי כדי להכניס גמישות ושליטה של מנהל הרשת על Sendmail מחוץ ל-sendmail.cf. לדוגמא, Sendmail מאפשר לנתב דואר נכנס לשרת אחר, או דואר מאימייל אחד למשתמש אחר.

הכל טוב ויפה כאשר יש שרת אחד לנהל. מה קורה כאשר יש 10? 20? (קיימות מערכות כאלו ואף גדולות יותר) אנחנו צריכים מקום מרכזי שיחזיק את כל המידע הזה בצורה מרוכזת, כדי שדואר אשר נכנס בכל אחד מהשרתים יקבל את אותו "הטיפול". להצלתנו מגיע כמובן LDAP הפרוטוקול ו-OpenLDAP השרת.

למי שחי מתחת לאדמה בשנים האחרונות ולא שם לב, LDAP הפך להיות ה"סכין צבאית שוויצרית" (Swiss Army Knife, נשמע יותר טוב באנגלית, תודו) של אנשי ה-IT. אם פעם היה מחזיק רק משתמשים או כתובות, היום הוא כבר "יודע" להחזיק מידע כמו מפות של Sendmail/Postfix, מידע DNS-י, משתמשים, קבוצות, automounts ומה לא… במקרה שלנו, נרתם שרת ה-LDAP כדי להחזיק מפות של Sendmail. לא רע בכלל בשביל פרוטוקול צעיר (יחסית, בערך מ-1993).
LDAP (או Light Weight Directory Access) תוכנן כפרוטוקול שנועד להחזיק מידע היררכי בצורה יעילה ומהירה לגישה, וזה בדיוק מה שהוא עושה פה בעבור Sendmail.

על הנושא של התקנת, קינפוג ותחזוקת שרת OpenLDAP לא אדבר, כי הוא חורג מגבולות הבלוג הזה שמטרתו: שירת הלל ל-LDAP. בכל מקרה, אז איך אנו גורמים ל-Sendmail לדבר עם שרת LDAP? ואיך אנו גורמים לו לשאול את השאלות הנכונות? בואו ואספר לכם.

בתור התחלה, נצטרך להגיד לשרת ה-LDAP כיצד לבנות רשומות שיבין Sendmail, איך עושים את זה? במילה אחת - sendmail.schema. סכמה היא קובץ המגדיר סוגי אוביקטים, סוג המידע שבכל אוביקט ואת היחס ביניהם. ניתן למצוא את הסכמה בקבצי המקור של Sendmail או ברוב ההפצות כיום. את הסכמה יש לשים בספריית הסכמות של OpenLDAP (בד"כ /etc/openldap/schema) ולהוסיפה לקובץ הקונפיגורציה של OpenLDAP:

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/sendmail.schema

שלב הבא במסענו לארץ LDAP, יהיה יצירת המפות כדי ש-Sendmail יוכל לגשת אליהם, ניצור את ה-DN הבסיסי ומתחתיו את המיפויים. בדוגמא הבאה ניצור מפה מסוג virtusertable:

# cat > ldap-virtuser 
dn: sendmailMTAMapName=virtuser, dc=example, dc=com
objectClass: sendmailMTA
objectClass: sendmailMTAMap
sendmailMTACluster: example.com
sendmailMTAMapName: virtuser

dn: sendmailMTAKey=user@example.com, sendmailMTAMapName=virtuser, dc=example, dc=com
objectClass: sendmailMTA
objectClass: sendmailMTAMap
objectClass: sendmailMTAMapObject
sendmailMTAMapName: virtuser
sendmailMTACluster: example.com
sendmailMTAKey: user@example.com
sendmailMTAMapValue: user-example

כדי להוסיף את המפה נצטרך להשתמש בכלי ldapadd של OpenLDAP:

# ldapadd -D cn=manager,dc=example,dc=com -b dc=example,dc=com -W -x < ldap-virtuser

מצויין! יש לנו רשומה בשרת ה-LDAP שממפה את user@example.com למשתמש user-example.

שלב אחרון במזימה שלנו הוא קינפוג Sendmail שידע לחפש בשרת ה-LDAP, על מנת לעשות זאת, נצטרך להכניס כמה שינויים ותוספות ב-sendmail.mc חפשו את השורה

FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl

והחליפו אותה בשורות הבאות:

define(`confLDAP_DEFAULT_SPEC', ` -h ldserver -b dc=example,dc=com')
define(`confLDAP_CLUSTER', `examplecom')
FEATURE(`virtusertable', `LDAP')

הערה: עוד מידע על האפשרויות של confLDAP_DEFAULT_SPEC בכתובת הבאה

כדי לצור sendmail.cf חדש, נשתמש במפענח m4:

m4 sendmail.mc > sendmai..cf

זהו, פשוט לא? אתחול זריז ל-Sendmail ואנחנו מוכנים לבדוק אם הכל עובד כמו שאנו מקווים. נבצע בדיקת מיפוי, ונראה שאכן המשתמש ממופה כמו שצריך:

# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /map virtuser user@example.com
map_lookup: virtuser (user@example.com) returns user-example (0)

מושלם! ביקשנו מ-Sendmail לפענח בעבורנו, מתוך המפה virtuser לאיזה משתמש מופנה הדואר בעבור הכתובת user@example.com, והתשובה הנכונה לא אחרה להגיע לאחר שאילתה קטנה לשרת ה-LDAP

אז נכון, Sendmail הוא יצור מאיים, LDAP הוא פרוטוקול שנראה מסובך, אבל השילוב בין השתיים יכול להביא לניהול נוח וגמיש בהרבה של שרתי Sendmail. תודו שאתם מופתעים מכמה שזה היה פשוט.

שרת במשקל נוצה

18/07/2007 19:50 ע"י כתריאל טראום

אני לא אוהב דברים מנופחים, באמת שלא. לא אוהב מחשבים מגודלים, אפליקציות מפלצתיותת, מערכות הפעלה מסובכות… לראיה, המחשב האהוב עלי בבית הוא ה-NSLU2 שלי שמריץ דביאן ומשמש בתור פיירוול\VPN\חייגן.

אם כך, זה לא פלא שכאשר גיליתי את Lighttpd התאהבתי ישר. "על מה הוא מדבר לעזאזל?" אתם בטח חושבים לכם. ובכן, lighttpd הוא חלופה קלה, מהירה וגמישה ל-Apache המוכר (ולפעמים מנופח). כמה מהתכונות של lighty (קיצור של lighttpd) שגרמו לי להתאהב הם:

  • שרת חד-נימי (Single-Threaded), מה שאומר שהוא משתמש בכמות זכרון נמוכה
  • בר הרחבה בעזרת מודולים (כמו rewrite, fastcgi, cgi, vhosts ועוד)
  • בנוי בעבור סביבות עתירות עומסים, עם אופציות שיפצור תואמות (שימוש ב-sendfile ועוד)

Lighty, אשר נכתב על ידי יאן קנשקה (Jan Kneschke) אי שם בשנת 2003, נכתב בכלל כהסחת דעת מכתיבת תעוד (שהוא מעיד עליו כחלק השנוא על כל מפתח, נשמע מוכר) לתיזה שלו. הוא התחיל את הפרויקט כנסיון לפתור את בעיית "10000 החיבורים לשרת" (C10K של דן קגל), ועד מהרה הגיע לשרת עם ביצועים מצויינים שהופך יותר ויותר פופולארי.

אז פעם הבאה שאתם שוקלים להקים שרת LAMP, אני מציע שתשקלו את החלופה הקלילה יותר, הקמת שרת LLMP

לאמן את הכלב

18/07/2007 19:45 ע"י כתריאל טראום

את מנוע החיפוש beagle לא צריך להציג, הוא מן הסתם החלופה הראויה ביותר ל-Google Desktop בעבור סביבת לינוקס. חלק מתכונותיו השימושיות כוללות עדכון בזמן אמת של תוצאות החיפוש, אינדוקס מיידי של דואר נכנס, שיחות ב-Instant Messenger וקבצים חדשים, יכולת אינדוקס של מגוון רחב של פורמטים ומקורות מידע ועוד.

Beagle נשען על מנוע האינדוקס המצויין Lucene מבית פרויקט Apache שהומר לשפת .Net

לאחרונה הוספתי דיסק קשיח נוסף למחשב אשר החזיק מסמכים, מוזיקה וסרטים ממערכת ישנה שלי. כיוון שהתנהגות ברירת המחדל של Beagle היא לאנדקס רק תוכן מתוך ספריית הבית, פתחתי את ממשק הקונפיגורציה שלו, והוספתי ספריה נוספת לאינדוקס:

לספריה /home/data/mm עיגנתי את הדיסק הנוסף. ברגע שנוסף ל-Beagle ספריה נוספת, הוא מתחיל ישר לסרוק אותה ולאנדקס את כל החומר החדש. הבעיה התחילה כאשר לקח לו יותר מדי זמן, ורציתי להתחיל למצוא מסמכים ושירים בצורה די מיידית (חיברתי את הדיסק כדי למצוא מסמך מסויים). הפתרון נמצא בדמות משתנה סביבה (Environment Variable), שכאשר הוא מועבר ל-Beagle, מורה לו להתחיל לסרוק בצורה נמרצת. התהליך הוא:

$ beagle-shutdown
$ export BEAGLE_EXERCISE_THE_DOG=1
$ beagled

אם בד"כ Beagle מנסה לגזול כמה שפחות משאבי מעבד וזכרון כדי לא להפריע לריצה נורמאלית, אז משתנה זה אומר לו לעשות הכל ולהשתמש בכל משאב שהוא רוצה כדי להתחיל ולסרוק שינויים ואוביקטים חדשים. אכן, תוך 15 דקות כבר היה הדיסק הקשיח החדש סרוק ומאונדקס כולו.

ומה איתי? בזמן שהכלבלב סרק, אני יצאתי בנתיים להפסקת קפה.

מחיקת תור ההודעות של Postfix

18/07/2007 19:43 ע"י כתריאל טראום

לאחרונה יצא לי לשדרג את מערכת ההפעלה של הפינגווין מפדורה בגירסא 5 ל-CentOS 5. אני מקווה שהצעד הזה ישאיר את המערכת מעודכנת ומאובטחת יותר לאורך זמן (פדורה 5 כבר אוטוטו עוברת ל-Legacy). בתהליך השדרוג, שכחתי לכוון את שרת הדואר של הפינגווין שיצא דרך ה-Mail Relay שלנו. כתוצאה מכך נתקעו לי לא מעט מיילים יוצאים בשרת הדואר הפנימי.
חשבתי כבר הנה שוב אצטרך לכתוב איזה שורת פקודה ארוכה ומסובכת כדי לרוקן את התור היוצא (כמו שאני בד"כ עושה עם סנדמייל שמחזיק מיילים לא רצויים). להפתעתי ושימחתי, גיליתי כלי ל-Postfix יש כלי לניהול התור שמסוגל לעשות זאת בשבילי. פקודה אחת קצרה ולעניין פתרה את כל הבעיה:

sudo postsuper -d ALL

פקודה זו תרוקן את כל התורים של Postfix: נכנס, יוצא ו-Deffered. ניתן למחוק בצורה סלקטיבית יותר, כמו תמיד man 1 postsuper יספק יותר מידע מבלוג זה.