S pokusy s kapsami to už pomalu ani není vtipné. Ovšem po letech spokojeného běhu s minimem občasných oprav nebylo dlouho nutné nic dělat. Jak je to vlastně dávno od úplného začátku? Na stole leželo kafe, v ICQ Ivka, byla cítit novoroční atmosféra… šest roků zpátky. Možná nastal čas se posunout zas o kousek dál. Kafe došlo, ICQ neexistuje, Ivka už vůbec ne. Existujeme vůbec? Kdo ví.
Netatalk 3 v Debianu jednu chvíli byl, pak zas nebyl. Až do minulých týdnů nebyla v testing Debianu dokonce ani kandidátská verze Netatalku 2, která se nyní objevila jako 2.2.5-1.1. Možná se teď všechno tak trochu konsoliduje k plnému vydání Stretche, kdo ví, asi ajo, jupiii jo. Nicméně verze třetí je vlastně jejím přepisem, hodně věcí v sobě vnitřně usnadňuje, ukládá si svoje věci do rozšířených atributů, umí spolupracovat s jinými nástroji pro umožnění plynulého fungování Spotlightu a ať už chceme, nebo nechceme, sjednocuje veškerou konfiguraci do jednoho o něco přehlednějšího místa. Teď už je jen otázka, jak to celé zakomponovat do běžícího systému bez zbytečného úsilí a násilí.
Prvním krokem je pochopitelně stažení zdrojových kódů z oficiální stránky; v době psaní je nejnovější verze 3.1.10 ze září 2016. Je to, jak už to u takových zdrojáků bývá, ovšem dost obecné, mělo by to celé běžet na libovolném systému a ne jen na Debianu. Každý ale musí v určitém bodě uznat, že funkční balíčkovací systém zkrátka má to kouzlo a slušelo by se takto stažený kód řádně debianizovat, k čemuž poslouží nástroj dh-make.
$ tar xvf netatalk-3.1.10.tar.bz2 $ cd netatalk-3.1.10/ $ dh_make -f ../netatalk-3.1.10.tar.bz2 Type of package: (single, indep, library, python) [s/i/l/p]? License : blank Package Name : netatalk Maintainer Name : Eida Version : 3.1.10 Package Type : single Date : Mon, 09 Jan 2017 20:27:03 +0100 Are the details correct? [Y/n/q] Done. Please edit the files in the debian/ subdirectory now.
V oficiální wiki je stručný průvodce kompilací pro Jessie, který zahrnuje především konfigurační parametry. Výchozí hodnoty jsou přijatelné, prakticky nás zajímá především podpora systemd a možná do budoucna i kerberos-ověřování proti doméně kavárny Active Directory, na druhou stranu není potřeba mít na headless serveru podporu pro D-bus a u pomalejších strojů s rozsáhlými úložišti může i vyloženě škodit podpora Spotlightu, realizovaná trackerem. Ale to je vše jakože ok. Zvolené konfigurační parametry přijdou do debian/rules jako výchozí.
override_dh_auto_configure: dh_auto_configure -- --with-init-style=debian-systemd --with-cracklib --enable-krbV-uam --with-pam-confdir=/etc/pam.d --with-dbus-daemon=/usr/bin/dbus-daemon --with-dbus-sysconf-dir=/etc/dbus-1/system.d --without-libevent --without-tdb --with-tracker-pkgconfig-version=1.0
Zvídavá otázka v tomto místě. Půjde to takhle přeložit na Debianu 9, který už dávno dávno přešel na knihovny OpenSSL 1.1.0 bez kompatibilního API 1.0.0? Samozřejmě, že ne. Pokus o make skončí na tomto místě trapným hlášením.
CC uams_dhx_passwd.lo
uams_dhx_passwd.c: In function ‘pwd_login’:
uams_dhx_passwd.c:143:7: error: dereferencing pointer to incomplete type ‘DH {aka struct dh_st}’
dh->p = pbn;
Tohle je chyba, kde se nemyslelo na dopřednou kompatibilitu a stále se využívají přímé ukazatele do struktur, což podle nových pravidel světa OpenSSL dělat už nikdo nesmí. A nebo může, ale pak dostane po rypáku, třeba segfaultem. Smůla je, že existuje velké množství programů, kde na tohle jejich autoři ještě nepřišli, mezi jiným se dá jmenovat třeba ESET ERA. Ten opravit nelze, u opensource je to naštěstí o šest levelů snazší. Debian v záplatách tradičně používá svůj přehoz, tedy quilt. Což znamená, že se v balíčku vytvoří série diffů, která je postupně aplikovaná při jeho sestavování. Nuže tedy.
$ quilt new 01-openssl11.diff Patch 01-openssl11.diff is now on top $ quilt add etc/uams/uams_dhx_pam.c $ quilt add etc/uams/uams_dhx_passwd.c $ vi etc/uams/uams_passwd.c $ vi etc/uams/uams_dhx_pam.c $ quilt refresh Warning: trailing whitespace in line 278 of etc/uams/uams_dhx_pam.c Warning: trailing whitespace in line 166 of etc/uams/uams_dhx_passwd.c Refreshed patch 01-openssl11.diff $ quilt pop -a Removing patch 01-openssl11.diff Restoring etc/uams/uams_dhx_pam.c Restoring etc/uams/uams_dhx_passwd.c
Samozřejmě přikládám zamýšlený výsledek, aby někdo nemohl říct, že se nechci podělit o tajemství vesmíru, tedy přesněji schopnost číst manuály.
--- a/etc/uams/uams_dhx_pam.c
+++ b/etc/uams/uams_dhx_pam.c
@@ -192,7 +192,8 @@
{
uint16_t sessid;
size_t i;
- BIGNUM *bn, *gbn, *pbn;
+ BIGNUM *bn, *gbn, *pbn, *qbn;
+ const BIGNUM *pubkey, *privkey;
DH *dh;
/* get the client's public key */
@@ -237,9 +238,12 @@
}
/* generate key and make sure that we have enough space */
- dh->p = pbn;
- dh->g = gbn;
- if (DH_generate_key(dh) == 0) {
+ DH_set0_pqg(dh, pbn, qbn, gbn);
+ int genkey = DH_generate_key(dh);
+
+ DH_get0_key(dh, &pubkey, &privkey);
+
+ if (genkey == 0) {
unsigned long dherror;
char errbuf[256];
@@ -252,7 +256,7 @@
ERR_free_strings();
goto pam_fail;
}
- if (BN_num_bytes(dh->pub_key) > KEYSIZE) {
+ if (BN_num_bytes(pubkey) > KEYSIZE) {
LOG(log_info, logtype_uams, "uams_dhx_pam.c :PAM: Err Generating Key -- Not enough Space? -- %s", strerror(errno));
goto pam_fail;
}
@@ -270,7 +274,7 @@
*rbuflen += sizeof(sessid);
/* public key */
- BN_bn2bin(dh->pub_key, (unsigned char *)rbuf);
+ BN_bn2bin(pubkey, (unsigned char *)rbuf);
rbuf += KEYSIZE;
*rbuflen += KEYSIZE;
--- a/etc/uams/uams_dhx_passwd.c
+++ b/etc/uams/uams_dhx_passwd.c
@@ -75,7 +75,8 @@
#ifdef SHADOWPW
struct spwd *sp;
#endif /* SHADOWPW */
- BIGNUM *bn, *gbn, *pbn;
+ BIGNUM *bn, *gbn, *pbn, *qbn;
+ const BIGNUM *pubkey, *privkey;
uint16_t sessid;
size_t i;
DH *dh;
@@ -140,9 +141,11 @@
}
/* generate key and make sure we have enough space */
- dh->p = pbn;
- dh->g = gbn;
- if (!DH_generate_key(dh) || (BN_num_bytes(dh->pub_key) > KEYSIZE)) {
+ DH_set0_pqg(dh, pbn, qbn, gbn);
+ int genkey = DH_generate_key(dh);
+ DH_get0_key(dh, &pubkey, &privkey);
+
+ if (!genkey || (BN_num_bytes(pubkey) > KEYSIZE)) {
goto passwd_fail;
}
@@ -159,7 +162,7 @@
*rbuflen += sizeof(sessid);
/* send our public key */
- BN_bn2bin(dh->pub_key, (unsigned char *)rbuf);
+ BN_bn2bin(pubkey, (unsigned char *)rbuf);
rbuf += KEYSIZE;
*rbuflen += KEYSIZE;
Po úpravách už nic nebrání sestavení balíčku začarováním debuild -i -us -uc -b. Nahoře vzniknou správně očíslované balíky, ty se do stroje nahodí pomocí dpkg -i a tak dále, žádná velká věda. Velkou výhodou je, že jakmile bude oficiální třetí verze Netatalku v repozitářích, půjde celkem plynule přejít.
Konfigurace se nasměrovala do /etc/afp.conf. To je docela pohodlné. Všichni se shodli, že u nových konfigurací použijí Samba-zápis, protože se prý osvědčil nebo co. Jako jo, nedá se tomu nic vytknout. Tabulka korespondencí konfigurace verze 2 s verzí 3 je také k dispozici na webu Netatalku, jen mírně se tam mluví o možnosti přejmenování domovského adresáře, který je všem ve společné speciální sekci [Homes] a implicitně vytváří ošklivá jména s apostrofy. Klíč k původní očekávané funkcionalitě je home name = $u.
Co ještě dodat závěrem? Že server musí být aktivovaný v systemd. Ale od toho je návod, přesto je potřeba nezapomenout zahodit starý rc skript od verze 2, aby nedošlo ke kolizím v názvech. Pokud se špatně ukazuje ikona, zřejmě bude ještě nutné restartovat Avahi. První pokusy s časovou kapsou se osvědčily a přinutily k dalšímu zamyšlení. Co když je všechna tragédie padajících kapes zakopaná v dbd CNID backendu? Ten funguje totiž tak, že pokud se do něj nevejde už víc, automaticky se vymaže. Pro časové kapsy lze použít ale tdb, který vychází z databází Samby, protože je v tomto ohledu o něco flexibilnější a u kapes nevadí, že se k nim nedá připojit souběžně z více míst - pokud tedy každý specializovaný share ovšem obsahuje právě jednu kapsu, žejo. Netatalk 3 udělal v tomhle ohledu jisté pokroky a chce to celé vyzkoušet, nebo nejlépe ještě kombinovat se zvýšením velikosti výchozího stripu kapsy, aby bylo už just zaručeno, že bude místa k popisování víc než dost. No, byl to vskutku kouzelný večer.