Az STSADM parancsainak kibővítése

A SharePoint üzemeltetők vagy a parancssoros megoldásokat kedvelők számára az STSADM igazi kincsesbánya a maga több, mint száz parancsával. Már a WSS-ben is 111 van belőlük, egy MOSS Enterprise változaton pedig összesen 184-et sikerült összeszámolnom. A dolog érdekessége, hogy ezt nem úgy oldották meg a fejlesztők, hogy a nagyobb változatnál más az stsadm.exe fájl, hanem úgy, hogy kiterjeszthetővé tették az eszközt. Íme a bizonyíték:

STSADM kiterjesztések MOSS-on

Magyarul a fejlesztők tudnak olyan komponenseket készíteni, ami újabb parancsként fog megjelenni ebben a parancssori eszközben. Mit nyernek ezzel a fejlesztők? Amint mindjárt látni lehet, kapunk bizonyos fokú parancssori paraméter feldolgozási szolgáltatásokat, ami megkönnyíti az életünket. Ráadásul a SharePoint rendszergazdák élete is jobb lesz, ha a saját kis kódunkat nem egy n+1. konzol alkalmazásba építjük bele a saját ízlésünk szerint, hanem abba az adminisztrátori eszközbe, melyet ők már ismernek. Az új parancsunkat is ugyanúgy tudják majd paraméterezni, lekérdezni a súgóját stb.

Így készül a saját parancs:

  1. Készítünk egy .NET-es class library-t.
  2. Egy osztályban implementáljuk az ISPStsadmCommand interfész mindkét metódusát.
  3. Erős névvel látjuk el a szerelvényt és a GAC-ba telepítjük.
  4. Készítünk egy leíró XML fájlt, amit a CONFIG mappába telepítünk.

Példaként tekintsük azt a problémát, hogy webhelyek mesterlapjának címét szeretnénk szkriptből lekérdezni és beállítani. Ez azért is jó feladat, mert WSS esetén még a webes felhasználói felületre sincs kivezetve ez az opció, kódból pedig nem nagy ügy, csak az SPWeb.MasterUrl vagy CustomMasterUrl tulajdonságokat kell beállítani.

Készítettem egy C# nyelvű class library projektet, majd a tulajdonságlapján beállítottam a szerelvény nevét és az alapértelmezett névteret. Itt bár a javasolt elnevezési konvenció Cég.Technológia.Szolgáltatás.Alszolgáltatás, én rövidebbre vettem:

Projekt tulajdonságai

Ezek után készítettem egy MasterPageCommands nevű osztályt, amelyben implementáltam a Microsoft.SharePoint.StsAdmin.ISPStsadmCommand interfészt, aminek mindössze két metódusa van:

  • string GetHelpMessage( string command ): Ezzel a metódussal adjuk vissza a parancshoz tartozó súgó szöveget. Ez a metódus akkor fog lefutni, amikor a felhasználó az stsadm -help kapcsolót használja, illetve akkor, ha rosszul paraméterezi fel a mi parancsunkat. A doksi szerint az általunk visszaadott szöveg előtt minden esetben meg fog jelenni a "stsadm -o command n" szöveg, így tehát ezzel nem kell bajlódnunk. Sajnos azt tapasztaltam, hogy a sortörés után még egy tabulátort is megjelenít, ami miatt vacakolni kell a jól olvasható üzenet sorainak elrendezésével. Kéretik figyelni arra, hogy a kötelező paramétereket {}, az opcionálisokat [] jelek között írjuk le, a változókat pedig <> jelek közé tegyük.
  • int Run( string command, StringDictionary keyValues, out string output ): ez az igazi lényeg, itt implementáljuk a parancsot. A keyValues paraméterben megkapjuk az összes parancssori paramétert kulcs-érték párok formájában, tehát a parancssor feldolgozása nem a mi feladatunk. Az utolsó output paraméterben kell visszaadnunk azt a sztringet, amit a parancs a konzolon végül meg fog jeleníteni. A metódus int visszatérési értékével azt adhatjuk meg, hogy a parancs sikeresen lefutott (0), szintaktikai hibás (ErrorCodes.SyntaxError = -2) vagy valami más hiba történt (ErrorCodes.GeneralError = -1). Erre azért célszerű nagyon odafigyelni, mert egyrészt ha szintaktikai hiba van, akkor az STSADM automatikusan futtatja a GetHelpMessage metódust is, másrészt a mi parancsunk visszatérési értékét egy következő szkript figyelheti és így tudjuk neki jelezni, ha valami nem stimmel.

Látható, hogy mindkettő megkapja paraméterként a parancs nevét, így egyetlen osztállyal több parancsot is kezelhetünk. Én például egy getmasterurl és egy setmasterurl parancsot készítettem.

A tapasztalat az, hogy a kódunkban több helyen kell hivatkoznunk a parancs és a paraméterek nevére, ezért érdemes azokat kiemelni egy-egy konstansba.

Ha ez megvan, lássuk el a szerelvényünket erős névvel és telepítsük a GAC-ba. Ezután könnyű megszerezni a teljes nevét (például gacutil /l balassy.stsadm.commands), amire szükségünk lesz.

Készítsünk egy XML fájlt, ez fogja megadni az stsadm-nek, hogy milyen új parancsot akarunk hozzáadni és azt melyik szerelvényben találja meg. A fájlt kötelezően stsadmcommands.valamiegyedi.xml formában kell elnevezni (lásd a fenti MOSS ábrát) és ez legyen a tartalma:

<?xml version="1.0" encoding="utf-8" ?>
<commands>
    <command
        name="getmasterurl"
        class="Balassy.StsAdm.Commands.MasterPageCommands, Balassy.StsAdm.Commands, Version=1.0.0.1, Culture=neutral, PublicKeyToken=845904e0d09b2d0c"/>

    <command
        name="setmasterurl"
        class="Balassy.StsAdm.Commands.MasterPageCommands, Balassy.StsAdm.Commands, Version=1.0.0.1, Culture=neutral, PublicKeyToken=845904e0d09b2d0c"/>
</commands>

Ezt az xml fájlt a 12CONFIG mappába kell bemásolnunk és máris készen vagyunk, az STSADM már látja is az új parancsot; ha a -help kapcsolóval lekérdezzük a parancsok listáját, szépen ABC rendben megjelenik a standard parancsok között.

Fejlesztéshez egy trükk: állítsuk be úgy a projektet, hogy fordításkor automatikusan bemásolja az új XML-t a CONFIG mappába és a frissen fordított szerelvényt a GAC-ba. Én személy szerint ezt egy post build eseményként szeretem megadni, valahogy így:

Build events

A teljes parancs így néz ki:

  "$(DevEnvDir)....SDKv2.0Bingacutil.exe" -if "$(TargetPath)"
  copy /y "$(ProjectDir)StsAdmCommands.Balassy.xml" "C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12CONFIG"

Ha valaki kedvet kapott, nyugodtan írja meg saját parancs kiterjesztését, de előbb talán érdemes körülnézni a weben, hogy mik készültek már el. Gary Lapointe már közel százat készített, ráadásul az összes letölthető forráskóddal együtt vagy WSP formájában. A forráskód ugyan nem a legszebb és több komment is lehetne benne, de nagy előnye, hogy Gary elkészített egy teljes paraméter ellenőrző frameworköt, amit esetleg mi is tudunk hasznosítani.

Az általam készített fenti példa kódja pedig letölthető innen.

Technorati Tags: ,,,
Advertisements

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s