כתיבת CmdLets לניהול ה IIS, שימוש בפרמטרים (מאמר שממשיך את מה שהוסבר ב Web Cast הקודם)

7 בSeptember 2007

אין תגובות

ב WebCast שהקלטתי בנושא Windows Power Shell, הדגמתי איך אנחנו יכולים ליצור cmdlet, להגדיר לו installer ולרשום אותו בסביבת ה powershell  ולייצא shell מותאם אישית שמכיל אותו כבר כשהוא מוסף ומוגדר.

עכשיו, אנחנו נלמד איך ליצור cmdlet תחת ה verb ששמו add (כלומר, הוספת דברים), ושימוש בפרמטרים שמתקבלים מהמשתמש. לצורך העניין, אתם מוזמנים להוריד מפה את ה Solution המלא שאיתו אני עובד, שכולל 3 classes:

PSSnapin.cs – מכיל, למעשה, את ההתקנה של ה cmdlet. בתחילתו, מוגדר האטריביוט RunInstaller ובמהלכו, ב constructor, אני למעשה מוסיף לב collection של ה cmdlets את אלה ששלנו.

image

image

שימו לב, שבמהלך כל הפרוייקט אני עובד  מול מספר רפרנסים עיקריים – Microsoft.Web.Administration, שמאפשר לי שליטה בנוחות על IIS 7. דיברתי עליו פה, יש לי גם את System.Configuration.Install ואת System.Managment.Automation שהם, למעשה, חלק מה Power Shell SDK ומכילים את היכולת לעבוד מול ה Power Shell.

getWebsites.cs – אותו כבר הכרתם ב WebCast, הוא מכיל את הלוגיקה של קבלת כל האתרים מהIIS והצגת הרשימה שלהם.

מה שהווסף פה, זה addWebsites.cs, פה, כבר מדובר ב class חדש שמאפשר לנו הוספה של websites ל IIS7. בתחילת ה class הזה, אני מגדיר את ה attribute:

image

 כידוע לכם, כל cmdlet מחולק ל שני חלקים המופרדים במקף verb-noun. ה verb הוא מרשימה די קבועה, למשל get,add,new וכדומה. את ה noun אנחנו קבעים. נניח, לתצורך טיפול ב websites, במסגרת, למשל, פאנל ניהול שמקל על הIT (לאותו פאנל יכול אפילו להיות ממשק וובי, שמאחורי הקלעים מריץ את הפקודות הללו ב powershell, במסגרת האינטגרציה הדי עמוקה שיש שבמסגרתה אפשר ממש בקלות להפעיל runspace ולהריץ פקודות powershell מכל אפליקציה דוט נטית) לנהל את ה websites, יהיה לנו add-website, get-websites ו remove-website.

ב Attribute אנחנו מגדירים שה verb הוא add, ואחרי המקף תופיע המילה website.

בהמשך, אנחנו מגדירים מספר משתנים פרטיים:

image

ועבור כל אחד מהם חושפים property. השם של ה property, יהיה למעשה שם הפרמטר שצריך להעביר.

לפני ההצהרה על ה property, אנחנו שמים את האטריביוט הבא:

image

מה שאנחנו אומרים פה, זה שה property הבא הוא למעשה פרמטר שמועבר ל cmdlet, שאנחנו מאפשרים העברה ב pipeline לפי שם המאפיין (שם המאפיין הוא שם הפרמטר) ושמים איזשהו הודעת עזרה. אנחנו גם מגדירים לו איזושהי וואלידציה.

את זה אנחנו שמים לפני ההגדרות של המאפיינים השונים. במאפיינים עצמם, אני מגדיר רק set, כי זה מה שנחוץ.
במתודה ProcessRecord שעשיתי לה override יש את הלוגיקה עצמה. במקרה הזה, אם נזרק Exception אני למעשה “בולע” אותו ומתעלם, לא משנה מה הגורם לאקספשן (וואלידציה שנכשלה, פרמטרים שלא הועברו וכו’. אם יועבר נניח פרמטר בשם לא נכון, על זה ה power shell כבר יצעק).

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

השלב הבא, כבר ממש פשוט, דבר ראשון, אני הולך ל powershell כדי להסיר את ה snap in הזה שכבר הוספתי (אם הוספתם אותו במסגרת הוובקאסט) ומשתמש ב remove-pssnapin ומעביר ל installutility את הפרמטר /u כדי להגיד לו להסיר לי את הרכיב. (

הסברים מלאים תמצאו ב Web Cast הזה, לקראת סופו)

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

image

סימנתי בצבע שונה את הפרמטרים אותם אני מכניס. מפה, הכל עובד בצורה די חלקה – מובן, שבשביל להפוך את זה לאפליקציה אמיתית, עדיף להוסיף איזושהי וואלידציה האם הספרייה שהמשתמש מכניס קיימת בכלל, האם אין התנגשויות בנתונים (אם יש התנגשויות, הIIS יוסיף את ה website החדש אבל יעשה לו stop) והכל עבד תקין. אבל, כעיקרון, הכל עובד מעולה – קיבלנו פרמטרים, עבדנו לפיהם והוספנו website לIIS.

אתם מוזמנים לעבור על הקוד הזה, לשפר אותו (הוא מאד מאד בסיסי) ולנסות בעצמכם, זאת כל המטרה.

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

בהצלחה.

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *