Bu sayfa son olarak 2021-01 tarihinde güncellendi.

Note: We are no longer using monotone. The project has migrated all source repos to git.

I2P geliştirmede Monotone kullanımının ayrıntılarını açıklayan ve Complication tarafından hazırlanmış özgün rehber gözden geçirilmiş olarak sunulmaktadır. Temel yönergeler için hızlı başlangıç rehberine bakabilirsiniz.

I2P dağıtılmış bir geliştirme modeli kullanır. Kaynak kodu, bağımsız olarak yönetilen Monotone ("MTN") depolarına kopyalanmıştır. Kod gönderme hakkı olan geliştiriciler, değişikliklerini depoya itebilir (gönderme hakkı verilmeden önce bir lisans anlaşması imzalanmalıdır).

Dikkate değer Monotone özelliklerinden bazıları şunlardır: Dağıtılmış sürüm denetimi, şifreli kimlik doğrulama, erişim denetimi, küçük boyutu, az sayıda bağımlılığı olması, projeleri sıkıştırılmış bir SQLite veri tabanı dosyasında depolaması ve kesintiye uğramış eşitleme girişimlerini sürdürme yeteneğinin olması.

Bir Monotone istemcisi işletmek

Monotone anahtarları üretmek

Taşıyıcı anahtarı, değişikliklerinizi bir Monotone veri havuzu sunucusuna itme olanağı sağlar. Monotone üzerine kod göndermek için (temel olarak kodunuzu imzalamak), ayrıca bir gönderim anahtarı da gereklidir. Herkese açık I2P Monotone sunucularının hiçbirinde, kaynak kodunu okumak (veya çekmek) için şu anda bir anahtar gerekmez.

Taşıyıcı anahtarı olmadan bir kişi şu işlemleri yapamaz:

  • Genel okuma izni olmayan bir sunucudan kod çekemez
  • Herhangi bir sunucuya kod itemez
  • Bir Monotone sunucusu işletemez

Gönderim anahtarı olmadan bir kişi şu işlemleri yapamaz:

  • Herhangi bir kod gönderemez

Yalnızca MTN üzerinden kod almayı düşünüyorsanız, sonraki bölüme geçebilirsiniz. Eğer isterseniz anahtarları oluşturmak için aşağıdakileri okuyabilirsiniz.

Alışkanlığa göre anahtarlar bir e-posta adresi gibi adlandırılır. Ancak anahtara karşılık gelen bir e-posta adresinin bulunması şart değildir. Örneğin, anahtarlarınız şu şekilde adlandırılmış olabilir:

  • yourname@mail.i2p
  • yourname-transport@mail.i2p

Monotone, anahtarları $HOME/.monotone/keys klasörü altında anahtarlar ile aynı adı taşıyan metin dosyalarında tutar. Örneğin:

  • /home/complication/.monotone/keys/complication@mail.i2p

Taşıyıcı ve gönderim anahtarları oluşturmak için komut satırına aşağıdaki komutları yazın:

  • $ mtn genkey yourname-transport@someplace
  • $ mtn genkey yourname@someplace

Monotone, anahtarlarınızı korumak için sizden bir parola ister. Gönderim anahtarı için bir parola belirlemeniz önemle önerilir. Birçok kullanıcı, özellikle Monotone sunucusu işleyenler, taşıyıcı anahtarı parolasını boş bırakacaktır.

Güvenme ve deponuzu hazırlama

Monotone güvenlik modeli, hiç kimsenin fark edilmeden bir geliştiriciyi kolayca taklit etmesini engeller. Geliştiriciler hata yapabildiğinden ve saldırıya uğrayabildiğinden, yalnızca el ile gözden geçirmek kodun kalitesinden emin olunmasını sağlar. Monotone güvenilirlik modeli, doğru farkları okumanızı sağlar. Okuma farklarını değiştirmez.

Monotone deposu, projenin tüm kaynak kodunu ve geçmişini içeren tek bir dosyadır (sıkıştırılmış bir SQLite veri tabanı).

Monotone, geliştiriciler anahtarlarını Monotone içine aktardıktan ve güven değerlendirme bağlantılarını ayarladıktan sonra, güvenilmeyen kodun çalışma alanınıza gönderilmesini engeller. Güvenilmeyen kodu çalışma alanınızdan temizlemek için kullanılabilecek komutlar vardır. Ancak pratikte kullanılan itme erişim ilkeleri nedeniyle bunlara gerek duyulmaz.

Bir depoda birçok dal bulunabilir. Örneğin, depomuzda aşağıdaki ana dallar bulunur:

  • i2p.i2p — I2P yöneltici ve ilgili programlar
  • i2p.www — I2P projesi sitesi
  • i2p.syndie — Syndie, dağıtılmış forumlar aracı

Alışkanlık olarak, I2P Monotone deposu i2p.mtn olarak adlandırılır. Sunuculardan kaynak kodunu çekmeden önce, deponuz için bir veri tabanının başlatılması gerekir. Yerel deponuzu başlatmak için i2p.mtn dosyasının ve dal klasörlerinin kaydedilmesini istediğiniz klasöre geçin ve aşağıdaki komutu verin:

  • $ mtn --db="i2p.mtn" db init

Geliştirici anahtarlarını edinmek ve dağıtmak

Geliştiricilerin kod işlemek için kullandığı anahtarlar, Monotone üzerinde güvenilirlik değerlendirmesi için gereklidir. Diğer geliştiricilerin taşıyıcı anahtarları yalnızca Monotone sunucu işletmecileri için gereklidir.

Geliştiricilerin gönderim anahtarları, GPG imzalı başka bir sayfada yayınlanır.

Özgünlüklerini doğruladıktan sonra geliştiricilerin anahtarlarını içe aktarmak için tüm anahtarları yeni bir dosyaya kopyalayın. Bu dosyayı ( keys.txt gibi) i2p.mtn dosyasının bulunduğu klasörde oluşturun. Şu komutu vererek anahtarları içe aktarın:

  • $ mtn --db="i2p.mtn" read < keys.txt

Not: Anahtarları asla $HOME/.monotone/keys klasörüne el ile eklemeyin.

Güven değerlendirme bağlantılarını kurmak

Varsayılan Monoton güvenilirlik ilkesi, gereksinimlerimiz için çok gevşektir: Varsayılan olarak her göndericiye güvenilir. Bu durum, I2P geliştirmesi için kabul edilemez.

$HOME/.monotone klasörüne geçin ve monotonerc dosyasını bir metin düzenleyiciyle açın. Aşağıdaki iki işlevi kopyalayıp bu dosyaya yapıştırın:

-- This implements a list of trusted signers.
-- It is used on checkout and update.
-- It is not used for repo sync/push/pull.
-- If you do not include this function in ~/.monotone/monotonerc, the
-- default is to trust everybody, which is probably a bad thing
-- in an anonymous network.
-- Update the list below to reflect the signers YOU trust.
--
-- ref: http://www.monotone.ca/docs/Trust-Evaluation-Hooks.html
-- Modified to use key identities instead of key names, since
-- monotone allows duplicate key names, so any key-name-based
-- trust system is insecure.

--
--  Modified from intersection() to use key identities instead of key names, since
--  monotone allows duplicate key names.
--
--  a: table of ID structures (see above)
--  b: table of hex IDs
--
function keyintersection(a,b)
    local s={}
    local t={}
    for k,v in pairs(a) do s[v.id] = 1 end
    for k,v in pairs(b) do if s[v] ~= nil then table.insert(t,v) end end
    return t
end

--
-- from mtn source project.hh and lua_hooks.cc:
-- signers is a table of integers (starting with 1) to the following ID structure:
-- struct ID
-- {
--   id: (key_id in key_identity_info) hex of revision id hash;
--   given_name: (given_name in key_identity_info) // name given when creating the key
--   name: (official_name in key_identity_info) // name returned by hooks or (once implented) policy
-- };
-- id: hex of revision id hash;
-- name: cert_name
-- val: cert_value
--
function get_revision_cert_trust(signers, id, name, val)
   local trusted_signers = {
		"5bc185cfd680eb512fdb9626b9fb4298e136215e",	--  BlubMail@mail.i2p
		"f6706ac205e6b5d7a7e3ea4244ab0ef497f0a099",	--  cervantes@mail.i2p
		"690f278ff6c6157cbaf23b0d602b6d6dcf368313",	--  complication@mail.i2p
		"eb4ac08d5ddbb2bd73889f86c1211424025a6f07",	--  dev@robertfoss.se
		"aae785027c240ebbb0a883fd8ebcf8d6ecee4104",	--  dev@welterde.de
		"86478595288d1b96b58f0c8cd8a8971bc430f8fd",	--  dg2@mail.i2p
		-- completed dev agreement 2013-07 but never checked in anything
		--"5f75b8f0769770edc3267c21ddc9a00ddae31394",	--  digit@mail.i2p
		"4ebaace9973913416af92ee8d0fb93d64753df4c",	--  dream@mail.i2p
		"7e498ae94c9c322404adfc61b16bed388095906b",	--  duck@mail.i2p
		"6c728b0ffed3c2bf7fb0f3c583b30f966d9bacd5",	--  echelon2@mail.i2p
		"0e4e7ebebafbdf4cdacc45a47ba155b1215d8e8b",	--  forget@mail.i2p
		"f332b3d3b11b2efdae220cea75b9d5ba9ec3b52d",	--  hamada@mail.i2p
		"d681db14fd98da1efd6f8ceb2be6b91d784bdf5c",	--  hankhill19580@gmail.com
		"e246444b4fe69ba599e13403c4ab931066de902f",	--  hiddenz@mail.i2p
		"a61146ee69ddb9fcf3b82b19a62b8114b60d367e",	--  HungryHobo@mail.i2p
		"4844b1fd45f5a68744fa28d2f3e3b61a3cf83b95",	--  kytv@mail.i2p
		"6b2acfc9fe2f69b796631a514660fd7bdd237e2d",	--  laziestgravy@mail.i2p
		"c9b970f5e8917eada663d4c6b22096617021c95c",	--  m1xxy@mail.i2p
		"3be64909d6ab7c3d7afe16f20f24e672708b576b",	--  magma@mail.i2p
		"2977a6f4e11819a3f928783175caadc0071fc4de",	--  mathiasdm@mail.i2p
		"de9d196e8057e1629178edbfa1ed754c648d7340",	--  meeh@mail.i2p
		"2a0bba98558d7a9d7e4b1bd807789601252c0024",	--  mkvore-commit@mail.i2p
		"6ade4b7a9a6425194f482ab351950e4230dbbc85",	--  neutron@mail.i2p
		"bc74b49fd8a20513b2745a3d13414b7e9818dd18",	--  Oldaris@mail.i2p
		"3fb8d1ee1e82981a8076ddbcbf4d18f372b8bba7",	--  privateer@mail.i2p
		"e3815f0c985663182534fbd7d6a2bf93204a0bd0",	--  russiansponsor@mail.i2p
		"2ef1ae1e73a30e1afc0b4a7af89b4380b3dd46b7",	--  slumlord@mail.i2p
		"1092773c40f5813b9179d52a8ab7b499b9554da3",	--  sponge@mail.i2p
		"01265f0c817b24548478341fb75e672720a78b21",	--  str4d@mail.i2p
		"38fe2aa37e1eb9a300a2061ef153265c48031c6b",	--  walking@mail.i2p
		"a0eb78d437efad120dd9edcd776a327ec2c2adde",	--  zab@mail.i2p
		"2158706490e62a17c8140b6e9eabca965b681bc7",	--  zab2@mail.i2p
		"56810cd6434ab33593260e188b32bb83e4e9a139",	--  z3r0fox@mail.i2p
		"896e399990704373125f782ae2ee19b6611ac612"	--  zzz@mail.i2p
   }
   local t = keyintersection(signers, trusted_signers)
   if t == nil then return false end
   if #t>= 1 then return true end
   return false
end

İlk işlev, bizim durumumuzda bir revizyonun imzalayanları ile güvenilir imzalayanlarından oluşan iki küme arasındaki kesişimi belirler.

İkinci işlev, argüman olarak "imzalayanlar" ve "güvenilir" ile ilk işlevi çağırarak belirli bir revizyondaki güvenilirliği belirler. Kesişim kümesi boşsa, revizyona güvenilmez. Kesişim kümesi boş değilse, revizyon güvenilirdir. Olabilecek diğer durumlar revizyona güvenilmez.

Güvenilirlik değerlendirme bağlantıları hakkında ayrıntılı bilgi almak için resmi Monotone belgelerine bakabilirsiniz.

i2p.i2p, i2p.www ve i2p.syndie dallarını çekmek

I2P, projenin Monotone sunucusuna yönelen önceden yapılandırılmış bir tünel ile gönderilir. 127.0.0.1:8998 adresinden kaynak kodunu çekmeyi denemeden önce tünelin I2PTunnel içinden başlatıldığından emin olun.

i2p.mtn dosyasını hazırladığınız klasörü yazın. Yalnızca I2P kaynaklarını mı yoksa I2P sitesi ve Syndie kaynaklarını da mı istediğinize bağlı olarak, çekme işlemini farklı şekillerde gerçekleştirebilirsiniz.

Yalnızca I2P kaynakları istiyorsanız:

  • $ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"

Tüm dalları istiyorsanız:

  • $ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.*"
Aktarım tamamlanmadan iptal edilirse, çekme komutunu yinelemek aktarımı sürdürür.

Yukarıdaki örneklerin çekilmesi, boş bir taşıyıcı anahtarı belirtilerek anonim olarak yapılır. Herkes anonim olarak çekerse, sunucunun denetimini ele geçiren bir saldırganın bazı kişilere kurcalanmış verileri seçici olarak sağlaması daha zor olacaktır.

Güven değerlendirmesinin işe yaradığını doğrulamak

Güven değerlendirmesinin işe yaradığını doğrulamak için:

  • monotonerc dosyanızın yedeğini alın.
  • monotonerc dosyanızı değiştirerek Trusted_signers değişkenini aşağıdaki şekilde ayarlayın:
           local trusted_signers = {}
      
  • monotonerc yukarıdaki gibi yapılandırıldığında, Monotone artık hiçbir göndericiye güvenmez. i2p.mtn dosyasının oluşturulduğu klasöre geçiş yapıp I2P dalına göndermeyi deneyerek bunu doğrulayın:
    • $ mtn --db="i2p.mtn" co --branch="i2p.i2p"

    i2p.i2p adlı bir dizin görünmemelidir. Aşağıdakiler gibi birçok hata iletisi görmelisiniz:

        mtn: warning: trust function disliked 1 signers
        of branch cert on revision 523c15f6f50cad3bb002f830111fc189732f693b
        mtn: warning: trust function disliked 1 signers
        of branch cert on revision 8ac13edc2919dbd5bb596ed9f203aa780bf23ff0
        mtn: warning: trust function disliked 1 signers
        of branch cert on revision 8c4dd8ad4053baabb102a01cd3f91278142a2cd1
        mtn: misuse: branch 'i2p.i2p' is empty
      

    Sonuçlardan memnunsanız, yukarıda oluşturulan monotonerc yedeğini geri yükleyin. Önerildiği gibi bir yedekleme oluşturmadıysanız, Güvenilirlik değerlendirme bağlantılarını ayarlama konusunu yeniden okuyun.

    Son sürümün çalışan bir kopyasına geçmek

    Zaten kullanıma alınmış bir dalınız varsa, sonraki bölüme atlayın.

    i2p.mtn dosyasının bulunduğu klasöre geçin. Oradaki şunu yazın:

    • $ mtn --db="i2p.mtn" co --branch="i2p.i2p"

    Geçiş, hata iletileri olmadan tamamlanmalı ve geçerli klasörde i2p.i2p adlı bir klasör görünmelidir. Tebrikler! Derlenmeye hazır en son I2P kaynaklarına geçtiniz.

    Çalışan kopyanızı son sürüme güncellemek

    Bunu henüz yapmadıysanız, sunucudan yerel Monotone deponuza taze kodları çekin. Bunu yapmak için i2p.mtn dosyasının bulunduğu klasöre geçin ve şunu yazın:

    • $ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"

    Şimdi i2p.i2p klasörünüee geçin ve orada şunu yazın:

    • $ mtn update

    Bir sorun çıkmadıysa…Tebrikler! En son I2P kaynaklarına geçtiniz. Bu kaynaklar derlenmeye hazır olmalı.

    Bir Monotone sunucusu işletmek

    Geliştiricinin taşıyıcı anahtarlarını edinmek ve dağıtmak

    Bir sunucu işletmecisi olarak, belirli geliştiricilere itme erişimi izni vermek isteyebilirsiniz.

    Çekme ve itme erişimi izinlerini vermek

    Monotone sunucusu varsayılan olarak tüm erişimi reddeder.

    Tüm istemcilere çekme erişimi vermek için aşağıdakileri ayarlayın $HOME/.monotone/read-permissions:

        pattern "*"
        allow "*"
    

    Açıkça izin verilmeden hiç kimse sunucunuza kod itemexz. İtme erişimi vermek için:

    • Kullanıcının taşıma anahtarının adını şuraya ekleyin: $HOME/.monotone/yazma izinleri, örneğin
          zzz-transport@mail.i2p
          complivation-transport@mail.i2p
      
      her satıra bir anahtar yazın.
    • Taşıma anahtarını veri tabanınızın içine aktarın. Taşıyıcı anahtarlarını içe aktarma işlemi, Geliştirici anahtarlarını edinmek ve dağıtmak bölümünde açıklanan gönderim anahtarlarını içe aktarma işlemiyle aynıdır.

    Monotone uygulamasını sunucu kipinde çalıştırmak

    Monotone sunucunuz için ayrı bir veri tabanı kullanılmalıdır çünkü monotone, başkalarına sunulurken veri tabanını kilitler. Geliştirme veri tabanınızın bir kopyasını alın, ardından sunucuyu şu komutla başlatın:

    • $ mtn serve --bind="127.0.0.1:8998" --db="i2p.mtn" --key "myserver-transport@mail.i2p"
    Anahtarınız bir parola ile korunuyorsa, ilk istemci bağlandığında Monotone parolayı isteyebilir. Sunucunuza ilk istemci bağlantısını kurarak (ya da taşıyıcı anahtarınız için parolayı temizleyerek) bu sorunu aşabilirsiniz.

    Sunucunuzun I2P üzerinden başkaları tarafından erişilebilir olması için bir sunucu tüneli oluşturmanız gerekir. "Standart" tünel türünü ve "Toplu" profili kullanın.

    Debian GNU/Linux altındaki farklılıklar

    Debian (diğer bazı dağıtımların yanı sıra), Monotone uygulamasını arka plan işlemleri/hizmetleri çatısıyla bütünleştirdi. Monotone sunucuları Debian sistemlerinde hala "sıradan şekilde" çalıştırılabilse de, bunu "Debian yoluyla" yapmak daha kolay olabilir.

    İzinleri vermek için, /etc/monotone/read-permissions ve /etc/monotone/write-permissions dosyaları düzenlenmelidir. Monotone uygulamasının başlangıçta yüklenmesi sağlamak veya sunucu, bağlantı noktası veya veri tabanı konumunu değiştirmek için /etc/default/monotone dosyasını da düzenlemeniz gerekir.