Drupal 6.x telepítése (Squeeze)
A Drupal egy elterjedt, PHP-MySQL alapú web tartalomkezelő (CMS) és prezentációs szoftver (portal engine). A Drupal fejlesztői környezetként is használatos, mert funkcionalitása modulokkal könnyen bővíthető (web development framework).
Ebben a leírásban a Drupal 6.x nagyverzióját farmként (megbízható fejlesztőknek nyújtott hosting szintű szolgáltatásként), az alábbi házirend szerint telepítjük:
- a szerverre (nagyverziónként) egy közös Drupal kódkészlet települ;
- minden Drupal instance (web) önálló upload tárterületet és adatbázist használ;
- minden Drupal instance használhatja a rendszerszintű modulokat és témákat (sminkeket), valamint használhat önálló modulokat és témákat is, amelyeket azonban (futtatható kódok lévén) megbízható fejlesztői hozzáféréssel (DAV) kell telepíteni;
- a Drupal instance-nak van egy egyedi (technikai) neve (a továbbiakban WEBNAME)
- a használt adatbázis neve dr_WEBNAME;
- az adatbázis-felhasználó neve dr_WEBNAME;
- minden fenti account jelszava generált;
- a Drupal instance egyedi (technikai) nevének nem kell közvetlen összefüggésben lennie a virtualhost névvel;
- TODO: átgondolni, kiegészíteni!
Tartalomjegyzék
- 1 Előfeltételek
- 2 Telepítés
- 3 Közös beállítások
- 4 Értesítés biztonsági bejelentésekről
- 5 Virtualhost (website) felvétele
- 5.1 MySQL adatbázis készítése
- 5.2 Website felvétele önálló Apache virtualhostként
- 5.3 Használatba vétel
- 5.4 Célszerű beállítások
- 5.5 Tartalom tesztoldal feltöltése
- 5.6 Egyéni smink telepítése
- 6 Drupal frissítés
Előfeltételek
- Apache 2.x + WSM2 (Debian csomagból, illetve policy szerint telepítve)
- MySQL 5.x (Debian csomagból policy szerint telepítve)
- PHP 5.x (Debian csomagból policy szerint telepítve)
- XMLContent modul esetén + PHP XSL
- TODO!
Telepítés
A Debian Squeeze tartalmazza ugyan a Drupalt, de annak fejlődése gyorsabb, mint azt a disztribúció követni tudja, így a közös kódkészletet tarball-ból telepítjük és nem vesszük igénybe a Drupal csomaghoz biztosított Debian security supportot.
A telepítéshez a /usr partíciót írhatóan kell mount-olnunk, ezután szerezzük be a telepítőkészletet, és tömörítsük ki a /usr/local/share/ útvonalra, majd a verziószámot is tartalmazó célkönyvtárra készítsünk symlinkeket (security update előkészítése):
mount -o remount,rw /usr cd /root/tmp; export DSUBVERSION="6.x"; export DVERSION="6" # "x"-et az aktuális verziószámmal töltsük ki! wget "http://ftp.osuosl.org/pub/drupal/files/projects/drupal-$DSUBVERSION.tar.gz" # vagy más mirror tar xzvf drupal-$DSUBVERSION.tar.gz -C /usr/local/share/ ln -s /usr/local/share/drupal-$DSUBVERSION /usr/local/share/drupal-$DVERSION # Ha csak egyféle Drupalt hostolunk (nincs pl. 5.x és 6.x is) ln -s /usr/local/share/drupal-$DSUBVERSION /usr/local/share/drupal
A 6.x verziókban a lokalizációt (nyelvi file-okat) a telepítés során is használni lehet. A magyar változatot a drupal.hu-ról érdemes venni (tájékozódjunk, melyik az utolsó verzió - a jelen leírás készítésekor 1.2):
wget "http://ftp.drupal.org/files/projects/hu-6.x-1.2.tar.gz"
más nyelvi források a drupal.org webhelyről szerezhetőek be. A letöltött állományt a Drupal kódkészlet gyökerébe kell kicsomagolni, magyar verzió esetén pl. az alábbi paranccsal:
tar xzvf hu-6.x-1.2.tar.gz -C /usr/local/share/drupal-$DSUBVERSION
A kicsomagolt kódkészletben hozzunk létre három, egyelőre üres könyvtárat a közösen telepítendő külső könyvtáraknak, moduloknak és sminkeknek:
mkdir /usr/local/share/drupal-$DSUBVERSION/sites/all/libraries mkdir /usr/local/share/drupal-$DSUBVERSION/sites/all/modules mkdir /usr/local/share/drupal-$DSUBVERSION/sites/all/themes
Ezután a tarballokra már nincs szükség, azok törölhetőek, vagy pl. a /root/install könyvtárba archiválhatóak.
A kitömörítés után a Drupal kódállományok a root tulajdonában lesznek 755/644 jogokkal. A safe mode gid alatti futtatás miatt ezek nem futtathatnák az egyes virtualhostok alatti, a webadmin:www-data tulajdonában lévő kiegészítéseket. Ennek feloldására a teljes kódállományt a www-data csoport tulajdonába adjuk, oly módon, hogy az állományokat a csoport olvashassa, de a root felhasználón kívül senki ne írhassa:
find /usr/local/share/drupal-$DSUBVERSION -type d -exec chown root:www-data {} \; -exec chmod 750 {} \; find /usr/local/share/drupal-$DSUBVERSION -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;
Ezzel a közös kódkészletet előkészítettük.
Modulok és könyvtárak
Modulokat lehet rendszerszintű szolgáltatásként telepíteni, akkor azokat (a Drupal core moduljaival azonos módon) az egyes virtualhostok web adminisztrátorai webjük számára egymástól függetlenül, külön-külön aktiválhatják. Ezen felül minden virtualhost megbízható (DAV) adminisztrátora telepíthet modult önállóan, csak az adott virtualhost számára. Az így telepített modulok az adott virtualhostra nézve "felülbírálják" a közöseket.
Megjegyzés: a két eljárás között az a lényeges különbség, hogy a rendszerszintű modulokat minden instance-ra csak egyszerre lehet frissíteni, azaz ha a modulnak van adatbázis-vonzata, akkor a kód átírásával párhuzamosan minden instance-ban le kell futtatni az update.php scriptet, amit normálisan csak a webmaster (/user/1) tehet meg. Ha ez az account általában nálunk van, akkor érdemes lehet a gyakran használt modulokat közösen telepíteni; ha nem, akkor viszont egy frissítés sok egyeztetést igényelhet, így érdemesebb lehet minél kevesebb közös modult használni.
Modulokat elsősorban a Drupal modulgyűjteményéből lehet letölteni (futtatható kód, mindenképpen megbízható helyről szerezzük be!). A zip tömörítvényeket illetve tarballokat a /usr/local/share/drupal-*/sites/all/modules könyvtárba kell kitömöríteni, kicsomagolás után a tarballok törölhetőek.
Közös modulként érdemes telepíteni:
- Update status advanced settings (a core kiterjesztése pl. modulonkénti beállítás lehetőségével)
- WYSIWYG modulok
- WYSIWYG API (wrapper modul WYSIWYG szövegszerkesztőkhöz)
- CKeditor 3.x engine (nem CKEditor for Drupal 6 - az ugyanis egy komplett modul, nemcsak az engine!) - /usr/local/share/drupal-6/libraries/ckeditor-ba tenni!
- FCKeditor 2.x engine (FCKEditor retired) - /usr/local/share/drupal-6/libraries/fckeditor-ba tenni!
- TinyMCE 3.x engine - /usr/local/share/drupal-6/libraries/tinymce-be tenni!
- Magyar nyelvi csomag - /usr/local/share/drupal-6/libraries/tinymce/jscripts/tiny_mce/-be tenni!
- IMCE (képkezelő a WYSIWYG editorokhoz)
- IMCE-WYSIWYG API bridge (a képkezelő integrációja a WYSIWYG editorokba)
- HTML purifier (tartalomszerkesztésnél használatos HTML szűrő)
- HTML purifier engine (legalább 4.0.0) - csak a library kell belőle, ide: /usr/local/share/drupal-6/libraries/htmlpurifier/library
- WYSIWYG API (wrapper modul WYSIWYG szövegszerkesztőkhöz)
- API provider modulok
- Chaos tools suite - API gyűjtemény
- getID3 - médiaállományok (pl. MP3) beágyazott adatainak kezelése
- getID3 engine - /usr/local/share/drupal-6/libraries/getid3-ba tenni és a demos alkönyvtárát eltávolítani!
(TODO: működésre bírni a php-getid3 Debian package-dzsel.)
- getID3 engine - /usr/local/share/drupal-6/libraries/getid3-ba tenni és a demos alkönyvtárát eltávolítani!
- image cache - előre beállított képtranszformációk kezelése, tárolása
- image API - képkezelő API
- libraries API - általános könyvtár kezelő API
- token - token kezelő API
- transliteration - filenevek mentesítése az egzotikus karakterektől
- voting API - szavazások, értékelések API-ja
- TODO!
Hasznos, gyakran használatos modulok, amelyeket célszerű lehet közösként telepíteni:
- Content Construction Kit (tartalomtípusok)
- Content Templates (tartalomtípusok megjelenítése)
- date field
- e-mail field
- file field
- image field
- link field
- panels (konfigurálható placeholderek)
- views (konfigurálható listanézetek)
- Hozzászólások adminisztrációja
- akismet (spamfilter)
- captcha (spambotok által generált tatalmak kivédése pl. bevitelkori képfelismeréssel; kell hozzá legalább egy true type font is, pl. a /usr/share/fonts/truetype alól bemásolva vagy belinkelve)
- commentmail (levél az adminisztrátornak új hozzászólás esetén)
- quicktags (egyszerű szövegformázás támogatása)
- TODO!
A modulok és könyvtárak kitömörítése után azok állományainak fájlrendszerbeli jogait is be kell állítani a safe mode gid alatti használathoz:
find /usr/local/share/drupal-$DSUBVERSION/sites/all/ -type d -exec chown root:www-data {} \; -exec chmod 750 {} \; find /usr/local/share/drupal-$DSUBVERSION/sites/all/ -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;
Sminkek
A modulokhoz hasonlóan a sminkeket (theme, skin) is lehet rendszerszinten (/usr/local/share/drupal-6/sites/all/themes könyvtár) illetve per-virtualhost (var/www/FULLY.QUALIFIED.HOSTNAME/sites/all/themes) telepíteni. Előbbiek a megbízhatónak tekintett (DAV) adminisztrátorok által sem módosíthatóak, míg az utóbbiak igen.
Megjegyzés: általában nem tűnik érdemesnek a core Drupallal szállítottakon túlmenően rendszerszintű sminkeket telepíteni, hiszen a kinézetet minden instance adminisztrátora jogosan szeretné egyénileg testre szabni.
Sminkeket elsősorban a Drupal sminkgyűjteményéből lehet letölteni (futtatható kódot tartalmaz, mindenképpen megbízható helyről szerezzük be!). Ügyeljünk arra, hogy a megfelelő verziószámú (6.x) Drupalhoz készített sminket töltsük le!
A rendszerszintű sminkek kitömörítése után azok állományainak fájlrendszerbeli jogait is be kell állítani a safe mode gid alatti használathoz:
find /usr/local/share/drupal-$DSUBVERSION/sites/all/themes/ -type d -exec chown root:www-data {} \; -exec chmod 750 {} \; find /usr/local/share/drupal-$DSUBVERSION/sites/all/themes/ -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;
A létrehozott profil mentése
A közös modulok, könyvtárak és sminkek telepítése után a /usr partíciót csak olvashatóan újracsatolhatjuk:
mount -o remount /usr
Érdemes lehet a kibővített közös Drupal kódkészletet (ami tulajdonképpen egy Drupal telepítési profil) a /root/install könyvtárba elmenteni:
cd /root/tmp tar czvf drupal-$DSUBVERSION-profiled.tar.gz -C /usr/local/share drupal-$DSUBVERSION chmod 600 drupal-$DSUBVERSION-profiled.tar.gz mv drupal-$DSUBVERSION-profiled.tar.gz ../install/
Közös beállítások
Apache
Ha csak önálló virtualhostként telepített Drupal instance-okat használunk, a /usr/local/share/drupal* könyvtárakra külön Apache beállítások nem szükségesek. Aliasokon keresztüli elérés esetén TODO!
PHP
Vizsgáljuk felül a PHP globális beállításait:
- ini_set-re (TODO!), levélküldésre és include-ra szükség van - wsm2 esetén:
-rw-r--r-- root root /etc/php5/conf.d/wsm2-php5.ini [...] disable_functions = [ini_set, mail, include ne szerepeljenek itt - kommentezés nem jó!] [...]
Megjegyzés: a beállítások érvényesítéséhez a webszerverek konfigurációit újra kellene olvastatni, de ezt elhagyhatjuk, mert később a wsm2 úgyis megteszi.
Értesítés biztonsági bejelentésekről
Tekintettel arra, hogy a tarballból telepített Drupalhoz a Debian Security Team nem biztosít támogatást, külön gondoskodni kell arról, hogy értesítést kapjunk a biztonsági bejelentésekről és frissítésekről. Ehhez iratkozzunk fel a Drupal Security oldalon a levelezőlistára, vagy kövessük ezt az RSS csatornát.
Virtualhost (website) felvétele
MySQL adatbázis készítése
A MySQL adatbázisnak egyetlen, az adatbázisra nézve teljes jogú felhasználója van, akinek neve célszerűen megegyezik az adatbázis nevével. Az adatbázist és a felhasználót a MySQL root hozzáféréssel hozzuk létre.
mysql --defaults-file=/etc/mysql/root.cnf mysql> CREATE DATABASE dr_WEBNAME character set utf8 DEFAULT COLLATE utf8_hungarian_ci; mysql> GRANT ALL PRIVILEGES ON dr_WEBNAME.* TO 'dr_WEBNAME'@'localhost' IDENTIFIED BY 'PASSWORD'; mysql> FLUSH PRIVILEGES;
ahol a PASSWORD egy megfelelő jelszó. Relatív megjegyezhető, mégis erős jelszó a pwgen segédprogrammal is generálható, pl. a következőképpen:
/usr/bin/pwgen -s -n -c 12 1
Ellenőrizzük, hogy a felhasználó megfelelően létrejött-e:
mysql> SELECT host, user, password FROM mysql.user ORDER BY user; +-----------+------------------+---------------------------------------------+ | host | user | password | +-----------+------------------+---------------------------------------------+ | localhost | DBNAME | *73CDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | [...] +-----------+------------------+---------------------------------------------+ mysql> quit
Ezután próbáljunk a létrehozott felhasználó nevében és jelszavával belépni. Az alábbi parancsokkal ellenőrizhetjük, hogy a felhasználó jogosultságai valóban csak erre a Drupal adatbázisra terjednek ki:
mysql -u DBNAME -p Enter password: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | DBNAME | +--------------------+
A felhasználó felvételét és kipróbálását követően töröljük le a .mysql_history állományt, mert ebben a jelszó szabad szöveges formában benne van:
rm ~/.mysql_history
A 6.x sorozatú Drupal esetén az adatbázis iniciális feltöltését a telepítő PHP script végzi.
Website felvétele önálló Apache virtualhostként
Ez esetben a http://fully.qualified.hostname weboldal közvetlenül a Drupal web nyitólapjára mutat. A virtualhostot a szokott módon, a wsm2 segítségével készítjük el:
wsm2 -cw FULLY.QUALIFIED.HOSTNAME sysadmin@MYDOMAIN
Filerendszer beállítások
A wsm által létrehozott állományokat a bin, log könyvtár és az awstats link kivételével töröljük. A virtualhost tárterületén az egyedi tartalom részére a tárterületet (a sites könyvtárat és ezalatt az all és default/files hierarchiát) fizikailag is el kell készíteni (a default/files tárterületet safe mode gid-ben is írható módon), míg a /usr/local/share/drupal-* alatti összes többi tartalmat (benne a közösen elérhető könyvtárakkal, modulokkal és sminkekkel), illetve a maintainer által biztosított .htaccess állományt (benne a rewrite és biztonsági beállításokkal) egyszerűen belinkeljük:
cd /var/www/FULLY.QUALIFIED.HOSTNAME rm -R `ls -1 | grep -iv awstats | grep -iv bin | grep -iv log` # Ha farmunkon minden Drupal mindig ugyanolyan verziójú (nincs pl. 5.x és 6.x is) export DRUPAL="/usr/local/share/drupal" # Ha van Drupal 5.x, 6.x stb. is (általában ezt használjuk!) export DRUPAL="/usr/local/share/drupal-6" # Ha adott Drupal verzióhoz (pl. 6.1) készítsünk instance-t (nem javasolt, biztonsági frissítés miatt): export DRUPAL="/usr/local/share/drupal-6.x" # "x"-et töltsük ki! echo $DRUPAL; ls $DRUPAL # Biztos, ami biztos... :-) # sites/all hierarchia, közös elemek mkdir -p sites/all/libraries; if [ -n "$(ls $DRUPAL/sites/all/libraries)" ]; then ln -s $DRUPAL/sites/all/libraries/* sites/all/libraries; fi mkdir -p sites/all/modules; if [ -n "$(ls $DRUPAL/sites/all/modules)" ]; then ln -s $DRUPAL/sites/all/modules/* sites/all/modules; fi mkdir -p sites/all/themes; if [ -n "$(ls $DRUPAL/sites/all/themes)" ]; then ln -s $DRUPAL/sites/all/themes/* sites/all/themes; fi ln -s $DRUPAL/sites/all/README.txt sites/all # Jogosultságok find sites -type d -exec chmod 2750 {} \; -exec chown webadmin:www-data {} \; find sites -type f -exec chmod 640 {} \; -exec chown webadmin:www-data {} \; find sites -type l -exec chown -h webadmin:www-data {} \; # sites/default hierarchia mkdir -m 2750 sites/default; chown webadmin:www-data sites/default ln -s $DRUPAL/sites/default/* sites/default find sites/default -type l -exec chown -h webadmin:www-data {} \; # sites/default/files hierarchia, írható elemek mkdir -m 2770 sites/default/files; chown webadmin:www-data sites/default/files; setfacl -d -m g::rwX sites/default/files mkdir -m 2770 sites/default/files/imce; chown webadmin:www-data sites/default/files/imce mkdir -m 2770 sites/default/files/pictures; chown webadmin:www-data sites/default/files/pictures mkdir -m 2770 sites/default/files/tmp; chown webadmin:www-data sites/default/files/tmp # Drupal-5 kompatibilitás, ha nem szükséges, elhagyható: ln -s sites/default/files files # közös kódkészlet belinkelése ln -s $DRUPAL/* . 2>/dev/null # amit már megcsináltunk, hibát adna ln -s $DRUPAL/.htaccess .htaccess # külön kell, mert rejtett file rm *.txt # a szövegállományok nem kellenek ln -s $DRUPAL/robots.txt robots.txt # kivéve a robots.txt-t # csak szépség find . -type l -exec chown -h webadmin:www-data {} \;
.info TLD esetén
Speciális probléma: a Drupal 6.x belinkelt .htaccess állományában szerepel ez a szabály:
-r--r----- webadmin www-data /usr/local/share/drupal-6/.htaccess [...] # Protect files and directories from prying eyes. <FilesMatch "\.(engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template)$"> Order allow,deny </FilesMatch> [...]
ami miatt az .info TLD alatt hibák keletkeznek (DirectoryIndex-ként nem jelenik meg az index.php). Ilyen domain esetében a .htaccess állományt linkelés helyett ki kell másolni a virtualhost gyökerébe, és az "info|" részt törölni a fenti szabályból.
TODO: jobb megoldást találni!
Webszerver beállítások
Módosítsuk a virtualhost (a wsm2 által létrehozott) Apache konfigurációját:
- a teljes virtualhostra vonatkozóan:
- vegyük ki az alábbi ModSecurity szabályokat:
- 950004 - XSS detection in REQUEST_FILENAME|ARGS|ARGS_NAMES
- 960009 - Missing user agent header
- 960010 - Content encoding isn't allowed
- 960015 - Require common headers
- engedélyezzük a PHP futtatását, engedélyezünk 32 MB RAM használatot;
- módosítjuk az open_basedir bejegyzést: egyrészt hozzátesszük a Drupal kódkönyvtárát, másrészt levesszük a wsm2 által a virtualhost alapkönyvtárának végére tett / jelet (mert a color modul csinál chdir /-t, ami meghagyott /-rel nem sikerül);
- módosítjuk az include_path bejegyzést és engedjük ennek futás közbeni felülbírálását (a HTMLPurifier modul miatt - jobb megoldás: TODO!);
- engedélyezzük a PHP file feltöltést, ha az APC telepítve van, a progress bar-t, megadunk méretkorlátot és egy ideiglenes könyvtárat;
- megadunk egy User-Agent headert a PHP-ból indított esetleges web kapcsolatokra;
- engedélyezzük a .htaccess állományok értelmezését;
- vegyük ki az alábbi ModSecurity szabályokat:
- speciálisan az adminisztrációs útvonalakra véglegesen tiltjuk a ModSecurity-t (jó szabályok? - TODO!);
- speciálisan a sites/default/files (írható) könyvtárra (a wsm2 /upload-hoz hasonlóan):
- tiltjuk a PHP futtatását;
- tiltjuk a .htaccess állományok értelmezését;
- a HTML, SHTML tartalmakat plain text-ként szolgáltatjuk ki;
- a wsm2 /upload-tól eltérően engedjük a közvetlen fájlkiszolgálást;
- speciálisan a /sites/default/files/backup névvel kezdődő alkönyvtárakra minden hozzáférést tiltunk;
- a nem használt (törölt) könyvtárakra vonatkozó bejegyzéseket (a bin kivételével, melyet kommentezünk) törölhetjük;
- a virtualhost ssl konfigurációját az esetleges ServerAlias-ok felvételét kivéve nem kell módosítani.
-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME <VirtualHost *:80> [...] <IfModule mod_php5.c> php_admin_flag engine on # php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME:/usr/local/share/drupal/ php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME:/usr/local/share/drupal-6/ # php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME:/usr/local/share/drupal-6.X/ # a HTMLPurifier miatt nem lehet php_admin_value! - sechole, TODO! # php_value include_path .:/usr/local/share/drupal/ php_value include_path .:/usr/local/share/drupal-6/ # php_value include_path .:/usr/local/share/drupal-6.X/ # # php_admin_value safe_mode_exec_dir bin/ php_admin_value memory_limit 32M php_admin_value file_uploads on # php_admin_flag apc.rfc1867 on php_admin_value upload_max_filesize 1M php_admin_value post_max_size 1M php_admin_value upload_tmp_dir /var/www/FULLY.QUALIFIED.HOSTNAME/sites/default/files/tmp/ php_admin_value user_agent 'Drupal (6.x)' [...] </IfModule> <IfModule security2_module> # Engine On/Off/DetectionOnly. SecRuleEngine On [...] # # Write your own per-virtualhost rules here. ## XSS detection in REQUEST_FILENAME|ARGS|ARGS_NAMES SecRuleRemoveByID 950004 ## Missing user agent header SecRuleRemoveByID 960009 ## Content encoding isn't allowed SecRuleRemoveByID 960010 ## Require common headers SecRuleRemoveByID 960015 # </IfModule> # Virtualhost itself. <Directory /var/www/FULLY.QUALIFIED.HOSTNAME> Allow from all AllowOverride all Options +FollowSymLinks Options +SymLinksIfOwnerMatch [...] </Directory> # ModSecurity disabled on admin activities. <LocationMatch "^/(admin)|(install\.php)|(update\.php)|(node/add)|(node/[0-9]*/edit)|(node/[0-9]*/webform)"> <IfModule security2_module> # Engine On/Off/DetectionOnly. SecRuleEngine Off </IfModule> </LocationMatch> [...] # Official upload directory (writable by www-data). <Directory /var/www/FULLY.QUALIFIED.HOSTNAME/sites/default/files> Allow from all AllowOverride none Options -FollowSymLinks Options +SymLinksIfOwnerMatch AddType text/plain .html .htm .shtml <IfModule mod_phpX.c> php_admin_flag engine off </IfModule> </Directory> # Hide backups (if any). <LocationMatch "^/sites/default/files/(backup)"> Order allow,deny Deny from all </LocationMatch> [...] </VirtualHost>
Egyéb beállítások
A virtualhostok egyéni Drupal beállításait a telepítő a sites/default/settings.php állományban helyezi el; tekintettel a szigorúságunkra :-), ezt az állományt a telepítés előtt létre kell hozni a www-data felhasználó számára (csoport jogán) írható módon:
cp -p sites/default/default.settings.php sites/default/settings.php; chmod g+w sites/default/settings.php
Ezzel a Drupal virtualhost alapbeállítása megtörtént, a webszerver konfigurációk újraolvasása után használatba vehető:
invoke-rc.d apache2 reload
Használatba vétel
Tekintettel arra, hogy a frissen telepített Drupal az első, arra tévedő felhasználónak lehetőséget ad adminisztrátori hozzáférésre, a használatba vételt a webszerver konfiguráció újraolvasása után azonnal el kel végezni.
Telepítő futtatása
Egy, a telepítés alatti szervergépet grafikus böngészővel elérő munkaállomáson hívjuk be a http://FULLY.QUALIFIED.HOSTNAME/install.php weboldalt! A Drupal alapértelmezett telepítője jelenik meg, ahol
- válasszunk magyar nyelvet;
- adjuk meg a létrehozott MySQL adatbázis nevét és felhasználóját, valamint annak jelszavát (a felkínált haladó beállításokat általában nem kell változtatni).
A Drupal elvégzi a telepítést, és felszólít a sites/default/settings.php konfigurációs állomány írásvédetté tételére. Vegyük el a korábban megadott írásjogot:
chmod g-w sites/default/settings.php
és folytassuk a webhely alapbeállítását:
- adjuk meg a webhely nevét és e-mail címét;
- hozzuk létre (pl. webmaster néven) az "überadmin" (/user/1) Drupal felhasználót azonos e-mail címmel és generált jelszóval - a Drupal által közepes erősségűnek minősített jelszó pl. a
pwgen -c -n -s 12 1
paranccsal generálható;
- ellenőrizzük az időzóna, rövid webcímek és frissítéskeresés beállításait (általában nem kell bántani).
Ha a telepítő sikeresen lefutott, állítsuk vissza a mod-security működését:
-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME <VirtualHost *:80> [...] <IfModule security2_module> # Engine On/Off/DetectionOnly. SecRuleEngine on [...] </IfModule>
és olvastassuk újra a webszerver konfigurációját:
invoke-rc.d apache2 reload
Ezzel a telepítés elkészült, a továbbiakhoz shell hozzáférés már nem szükséges, a megbízható adminisztrátori (DAV, a Drupalon belül /user/1 és modulfejlesztés esetén SSH-tunnelezett MySQL) hozzáférés elegendő.
Azonnali teendők
az alábbiakat mindenképpen tegyük meg:
- az adminisztráció - felhasználó kezelés - felhasználó beállítások lapon az "Csak a webhely karbantartói hozhatnak létre új felhasználót." megjelölésével akadályozzuk meg, hogy bárki más felvehessen Drupal felhasználót.
Ezzel a Drupal virtualhost szerkesztői felületét biztosítottuk, a további beállítások szükség szerint elhalaszthatóak.
Cron karbantartás beállítása
A Drupal karbantartó funkciói számára szükséges egy cron job beállítása, amit wsm 2.3 (vagy újabb változatok) alatt legegyszerűbben egy, a .htcrontab állományba felvett sorral oldhatunk meg:
-rw-r----- webadmin www-data /var/www/FULLY.QUALIFIED.HOSTNAME/.htcrontab [...] 10,40 * * * * http://FULLY.QUALIFIED.HOSTNAME/cron.php 300
Ez a hívás fél óránként végrehajtódik, biztosítva ezzel a Drupal periodikus karbantartását.
Célszerű beállítások
Ezeket a beállításokat a szerkesztői felületen webmaster felhasználóként bejelentkezve az Adminisztráció oldalon tehetjük meg.
Webhely általános beállításai
- dátum és idő - az időzóna +0001 legyen, a hét első napja hétfő, a magyar dátumformák lehetnek pl.
Y. m. d. - H:i (rövid) D, Y. m. d. - H:i (közepes) l, Y. F j. - H:i (hosszú)
- webhely információk - a névtelen felhasználó neve legyen Látogató, a többit értelemszerűen töltsük ki.
- Adminisztráció - elérhető frissítések, Beállítások fülön vegyük fel a sysadmin@MYDOMAIN címet az értesítendők listájára.
Legújabb felület fordítások importálása
Töltsük le (saját gépünkre) a legfrissebb magyar nyelvi fordításokat tartalmazó .po állományt, és a webhelyépítés - felület fordítása - import lapon importáljuk azt. Az alapértelmezett beállításokkal ez a művelet nem változtat a meglévő magyar szövegeken (nem destruktív), de kiegészíti a fordítást a telepítéskor használt profilnál frissebb szövegekkel.
Felhasználókezelés előkészítése
Az alapértelmezett anonymous és authenticated user mellett a Felhasználókezelés, Csoportok menüpontban célszerű létrehozni egy 'tartalomszerkesztő' és egy 'webszerkesztő' csoportot, ezt követően a Felhasználókezelés, Felhasználók menüpontban (a frissítési lehetőségek használatával) a webmaster felhasználót fel kell venni a webszerkesztő csoportba.
Modulok telepítése és bekapcsolása
Amennyiben a kívánt illetve szükséges modulok rendszerszinten nem állnak rendelkezésre, azokat megbízható (DAV jogosult) adminisztrátorként a Drupal modulgyűjteményéből letöltött és kicsomagolt tarball-ok állományainak a webhely sites/all/modules/ könyvtárába DAV-on keresztül történő, könyvtárhelyes feltöltésével telepíthetjük. A DAV feltöltés automatikusan a safe mode gid-nek megfelelő file jogosultságokat állít be; ha rendszergazdaként shell hozzáféréssel telepítjük a modulokat, akkor pl. a következő parancsokkal adhatunk megfelelő jogokat:
pwd # /var/www/FULLY.QUALIFIED.HOSTNAME/ legyen! find sites/all/modules/ -type d -exec chown webadmin:www-data {} \; -exec chmod 2750 {} \; find sites/all/modules/ -type f -exec chown webadmin:www-data {} \; -exec chmod 640 {} \;
Telepítés után az alaprendszer opcionális modulok közül célszerű bekapcsolni az alábbiakat:
- book (több node összefogása navigálható könyvvé)
- contact (kérdőív modul)
- path (a Drupalon belüli URL aliasok)
- search (a Drupal saját keresője)
- upload (file feltöltés)
valamint a WYSIWYG támogatást:
- imce
- wysiwyg
- imce wysiwyg API bridge
- HTML purifier (csak a libraries bekapcsolása után!)
illetve a telepített API-ket:
- Chaos tools
- getID3()
- image API, image API GD2, image API imagemagick(?)
- libraries
- token
- voting API
és helper modulokat:
- transliteration
- update status advanced settings
A modulok bekapcsolását követően célszerű az update status ellenőrzése.
Tartalomfeltöltés előkészítése
Elsősorban szerkesztett ("web-1") webhely esetén a Drupal tartalomtípusai közül a Tartalom kezelés, Tartalom típusok menüpontban a címlapra kerülés alapértelmezését mindhárom (oldal, írás, könyvlap) tartalomtípusra célszerű tiltottra állítani, és az írás kivételével a hozzászólás alapértelmezése is tiltott lehet.
A WYSIWYG tartalomfeltöltéshez egyfelől ki kell jelölni a Drupal HTML szűrőjén átengedendő formázásokat, másfelől be kell állítani ezek beillesztésére a TinyMCE kliens oldali HTML szerkesztőt és az IMCE képkezelőt.
HTML szűrés
A szövegbevitelnél manuálisan begépelt HTML formázások (esetleg rosszindulatú tartalmak) kiszűrésére szolgál, megjelenítéskor érvényesül: amit nem enged át, az nem megy át a böngészőnek küldött HTML-be. Több lehetőség is van, az egyik a Drupal beépített HTML szűrő eszköze (hátránya, hogy nem lehet szabályozni a tagek attribútumait, így pl. a style = inline formázásokat nem engedi érvényesülni), a másik a HTML Purifier modul.
Beépített HTML szűrő
A Webhely beállítása, Beviteli formák menüpontban adjunk hozzá egy Rich text nevű beviteli formát, melyet engedélyezzünk a tartalomszerkesztő és webszerkesztő csoport számára, és jelöljük meg a HTML korrektor, HTML szűrő, Sortörés-átalakító és URL szűrő használatát, valamint állítsuk be az engedélyezett HTML elemeket az alábbiakra:
<br> <b> <i> <u> <a> <em> <strong> <cite> <code> <sup> <sub> <img> <div> <p> <h1> <h2> <h3> <h4> <h5> <h6> <ul> <ol> <li> <dl> <dt> <dd> <table> <thead> <tbody> <tfoot> <th> <tr> <td> <embed>
Az <embed> megengedi, hogy forrás nézetben YouTube (vagy hasonló) anyagokat beszúrjon a szerkesztő. Ezekben a kódrészletekben szerepelnek <object> és <param> tagek is (igazából az <embed> elavult), de a Drupal IE-ben nem jeleníti meg az <object>-eket (ugyanezt a hibát WordPress-re ld. pl. itt - TODO!), ezért ezeket átmenetileg a szűrővel tiltsuk ki. Csúnya hack, tudom...
HTML Purifier modul
TODO!
A Webhely beállítása, Beviteli formák menüpontban adjunk hozzá egy Rich text nevű beviteli formát, melyet engedélyezzünk a tartalomszerkesztő és webszerkesztő csoport számára, és jelöljük meg a HTML Purifier, Sortörés-átalakító és URL szűrő használatát, valamint állítsuk be az engedélyezett HTML elemeket (Configure HTML Purifier, HTML, allowed) az alábiakra:
b[class],strong[class],i[class],em[class],u[class],cite[class],code[class],sub[class],sup[class],a[href|name|title|target|style|class],img[src|alt|height|width|align|hspace|vspace|style|class],br[clear|style|class],p[align|style|class],div[align|style|class],h1[style|class],h2[style|class],h3[style|class],h4[style|class],h5[style|class],h6[style|class],ul[type|style|class],ol[type|start|style|class],li[type|value|style|class],dl[style|class],dd[style|class],dt[style|class],table[align|width|border|frame|rules|bgcolor|cellpadding|cellspacing|width|style|class],th[align|valign|style|class],tbody[align|valign|style|class],tfoot[align|valign|style|class],th[colspan|rowspan|width|height|align|valign|nowrap|style|class],tr[align|valign|style|class],td[colspan|rowspan|width|height|align|valign|nowrap|style|class]
Ezen kívül jelenleg az EnableID értékét is yes-re kell állítani, különben az anchorok nem működnek, ld. itt, valamint egyszer át kell menni HTML Purifier advanced-be és az Allowed Frame Targets ablakban fel kell sorolni a _blank _parent _self _top standard frame neveket (soronként egy), különben nem működik az <a target="" [...]> attribútum.
IMCE
Az IMCE használatához a Webhely beállítása, IMCE alatt érdemes megszerkeszteni az alapértelmezett profile-t, és abban a Directory path-t sites/default/files/imce/u%uid-ra állítani (minden más maradhat alapértelmezett). Ezután hozzunk létre egy IMCE profile-t a szerkesztők számára, ebbe importáljuk a User-1 profil beállításait (korlátlan feltöltés) és állítsuk a Directory path-t sites/default/files/imce-re, majd rendeljük ezt a profilt a tartalomszerkesztő és webszerkesztő csoportokhoz.
TinyMCE
Rendeljük a Rich text tartalomtípushoz a TinyMCE szövegszerkesztőt a Webhely beállítása - WYSIWYG modul beállításainál, és szerkesszük meg a hozzá tartozó profile-t az alábbiak szerint:
- alapértelmezett használat, magyar nyelv (Basic setup - Enabled by default, Nyelv: hu)
- használható kontrollok (Buttons and Plugins - bold, italic, underline, strike-through, align left, align center, align right, justify, bullet list, numbered list, outdent, indent, undo, redo, link, unlink, anchor, image, cleanup, sup, sub, cut, copy, paste, remove format, character map, font style, paste text, paste from word, search, replace, table, IMCE, teaser break.)
- tiltsuk le a HTML font tag-ek inline stílussá konvertálását (Cleanup and output - Convert tags to styles: false).
Felhasználók beállításai
A Felhasználó kezelés, Jogosultságok menüpontban állítsuk be az alapértelmezett felhasználók és a létrehozott tartalomszerkesztő és webszerkesztő csoport jogosultságait! A webszerkesztő minden jogot megkaphat, míg a többiek számára a szükséges legkevesebb jogosultságot igyekezzünk megadni az alábbi házirend szerint (TODO!):
- anonymous - olvas, kérdőívet kitölthet
- authenticated - olvas, kérdőívet kitölthet, commentet írhat, esetleg avatart vagy egyéb file-t feltölthet, profilját módosíthatja
- tartalomszerkesztő - tartalmat és navigációt teljes körűen szerkeszt, de kódot nem írhat, profilját módosíthatja
- webszerkesztő - majdnem mindenhez joga van, de kódot nem írhat
Modul | be nem jelentkezett | azonosított | tartalomszerkesztő | webszerkesztő |
---|---|---|---|---|
block | - | - | adminisztráció | minden |
book | nyomtatóbarát | nyomtatóbarát | minden | minden |
comment | hozzáférés | hozzáférés, beküldés | minden | minden |
contact | elérés | elérés | minden | minden |
filter | - | - | - | minden |
locale | - | - | - | minden |
menu | - | - | adminisztráció | minden |
node | hozzáférés | hozzáférés | tartalom típusok adminisztrációja kivételével minden | minden |
path | - | - | minden | minden |
search | keresés, haladó keresés | keresés, haladó keresés | minden | minden |
system | - | - | adminisztrációs oldalak hozzáférése | minden |
taxonomy | - | - | adminisztráció | minden |
upload | megtekintés | megtekintés (esetleg feltöltés) | minden | minden |
user | - | profilok hozzáférése | profilok hozzáférése | minden |
Ne feledjük, hogy modulok bekapcsolása esetén a hozzáféréseket felül kell vizsgálni!
A csoport hozzáférések beállítása után hozzuk létre a tényleges szerkesztő felhasználókat, és a tartalomfeltöltést már ezen account-okkal végezzük.
Tartalom tesztoldal feltöltése
Tartalomszerkesztő jogosultságú felhasználóval belépve küldjünk be egy tesztoldalt oldal típusú tartalomként, Rich text beviteli formában, "Lorem ipsum" címmel, a WYSIWYG editor letiltása után ("disable rich text") a törzsbe az alábbi teszt HTML-t bemásolva:
<h1>Heading 1</h1> <p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="left" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p> <h2>Heading 2</h2> <p><a href="#" title="Clickable image"><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="right" /></a>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p> <h3>Heading 3</h3> <p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="left" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p> <h4>Heading 4</h4> <p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="right" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p> <h5>Heading 5</h5> <p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="left" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p> <h6>Heading 6</h6> <p><img src="/sites/default/files/imce/design-teszt-image.jpg" alt="Design test image" title="Design test image" hspace="5" width="100" height="100" align="right" />Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p><p>Lorem ipsum dolor sit amet, consectetuer <a href="#">adipiscing elit</a>, sed diam nonummy nibh euismod tincidunt ut laoreet dolore <a href="#">magna aliquam</a> erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis.</p> <h1>Lists</h1> <ul><li>Bullet list 1</li><ul><li>Bullet list 1.1</li><ul><li>Bullet list 1.1.1<br /></li></ul> </ul><li>Bullet list 2</li><li>Bullet list 3 </li></ul> <ol><li>Numbered list 1</li><ol><li>Numbered list 1.1</li><ol><li>Numbered list 1.1.1<br /></li></ol></ol><li>Numbered list 2</li><li>Numbered list 3</li></ol> <h1>Table</h1> <table border="0"> <tbody> <tr> <th><h1>Heading 1</h1></th> <th><h2>Heading 2</h2></th> <th><h3>Heading 3</h3></th> <th><h4>Heading 4</h4></th> </tr> <tr><th>row 1<br /></th> <td><p>data 11<br /> data 11</p></td> <td>data 12</td> <td>data 13</td> </tr> <tr> <th>row 2<br /></th> <td>data 21<br /></td> <td>data 22</td> <td>data 23<br /></td> </tr> <tr> <th>summary<br /></th> <th>summary 1<br /></th> <th> summary 2</th><th>summary 3</th></tr></tbody></table>
Beküldés előtt az IMCE használatával töltsünk fel egy 100x100px méretű, design-test-image.jpg filenevű képet, és előnézettel ellenőrizzük, hogy az a teszt tartalomban több helyen is megjelenik-e.
Ha a teszt tartalom beküldése sikeres, webmaster felhasználóként belépve érdemes lehet a nyitólapot átmenetileg az ezt a tartalmat megmutató node/1 útvonalra irányítani.
Egyéni smink telepítése
Sminkeket elsősorban a Drupal sminkgyűjteményéből lehet letölteni (futtatható kódot tartalmaz, mindenképpen megbízható helyről szerezzük be!). Ügyeljünk arra, hogy a megfelelő verziószámú (6.x) Drupalhoz készített sminket töltsük le! A sminket célszerűen DAV útján, a /sites/all/themes/sminkneve könyvtárba kell feltölteni. A DAV feltöltés automatikusan a safe mode-nak megfelelő file jogosultságokat állít be; ha rendszergazdaként, shell hozzáféréssel telepítjük a sminket, akkor a bemásolás után a következő parancsokkal adhatunk megfelelő jogokat:
pwd # /var/www/FULLY.QUALIFIED.HOSTNAME/ legyen! find sites/all/themes/ -type d -exec chown webadmin:www-data {} \; -exec chmod 2750 {} \; find sites/all/themes/ -type f -exec chown webadmin:www-data {} \; -exec chmod 640 {} \;
Hasznos sminkek:
- Gutenberg - ez valójában egy szűrő, a Drupal HTML kimenetét alakítja a Movable Type CSS által elvárt formájúra. Használathoz a MT design-t egy, a Gutenberg smink könyvtárában elhelyezett alkönyvtárba kell feltölteni, és - az általában a stílus nevét viselő - css fájlt át kell nevezni style.css-re.
TODO!
Drupal frissítés
A közös kódkészlet (Drupal Core illetve közös modulok) frissülése esetén (erről a Drupal Security Announcements RSS-e vagy levelező listája, illetve az Update Status modul értesít) az alábbiak szerint érdemes a frissítéseket elvégezni:
Core frissítése
A frissítéshez a /usr partíciót írhatóan kell mount-olnunk, ezután szerezzük be a frissített core telepítőkészletet, és tömörítsük ki a /usr/local/share/ útvonalra:
mount -o remount,rw /usr cd /root/tmp; export DSUBVERSION="6.x"; export DVERSION="6" # "x"-et töltsük ki! wget "http://ftp.osuosl.org/pub/drupal/files/projects/drupal-$DSUBVERSION.tar.gz" # vagy más mirror tar xzvf drupal-$DSUBVERSION.tar.gz -C /usr/local/share/
A 6.x verziókban a lokalizációt (nyelvi file-okat) a telepítés során is használni lehet. A magyar változatot a drupal.hu-ról érdemes venni:
export HUNVERSION="1.2" # ellenőrizzük, van-e újabb! wget "http://ftp.drupal.org/files/projects/hu-6.x-$HUNVERSION.tar.gz"
más nyelvi források a drupal.org webhelyről szerezhetőek be. A letöltött állományt a Drupal kódkészlet gyökerébe kell kicsomagolni, magyar verzió esetén a:
tar xzvf hu-6.x-$HUNVERSION.tar.gz -C /usr/local/share/drupal-$DSUBVERSION
paranccsal. Ezután a tarballokra már nincs szükség, azok törölhetőek.
A kitömörítés után a Drupal kódállományokat a root:www-data tulajdonába adjuk, hogy azokat a webszerver a safe mode GID beállítás mellett is futtathassa, de ne írhassa:
find /usr/local/share/drupal-$DSUBVERSION -type d -exec chown root:www-data {} \; -exec chmod 750 {} \; find /usr/local/share/drupal-$DSUBVERSION -type f -exec chown root:www-data {} \; -exec chmod 640 {} \;
Ezután másoljuk át a jelenlegi Drupal kódkönyvtárból a /sites/all alatti összes olyan könyvtárat (közös library-t, modult és sminket), amelyik a frissen telepített Drupal kódkönyvtárban nem szerepel (ezt célszerű kétpaneles filekezelővel, pl. Midnight Commanderrel végezni - script: TODO!). Ezzel az új közös kódkészletet előkészítettük az aktiválásra.
Az aktiválás úgy történik, hogy a Drupal symlinkeket átírjuk úgy, hogy a frissítést tartalmazó könyvtárra mutassanak. Az aktiválást érdemes az érintett Drupal site-ok webmestereivel (/user/1) egyeztetni, mert szükséges lehet az /update.php lefuttatása.
Aktiválás után a /usr csak olvashatóan visszacsatolható:
mount -o remount /usr
Közös modulok frissítése
TODO!