Note: We are no longer using monotone. The project has migrated all source repos to git.
Ini adalah versi revisi dari Original Complication panduan yang merinci penggunaan Monotone dalam pengembangan I2P. Untuk petunjuk dasar, lihat quick-start guide .
I2P memiliki model pengembangan terdistribusi. Kode sumber direplikasi di repositori Monotone ("MTN") yang dikelola secara independen. Pengembang dengan hak komit dapat mendorong perubahan mereka ke repositori (sebuah perjanjian lisensi perlu ditandatangani sebelum hak komit diberikan).
Beberapa kualitas penting Monotone adalah: terdistribusi kontrol versi, otentikasi kriptografi, kontrol akses, ukurannya yang kecil, hanya sedikit dependensi, penyimpanan proyek dalam file database SQLite terkompresi, dan memiliki kemampuan untuk melanjutkan usaha sinkronisasi yang terganggu.
Mengoperasikan Klien Monotone
Membuat Kunci Monotone
Kunci transport memberi anda kemampuan untuk mendorong perubahan anda ke server repositori Monotone. Untuk melakukan commit code ke Monotone (pada dasarnya menandatangani kode Anda), sebuah commit key juga diperlukan. Tidak ada server Monotone yang ada di I2P saat ini membutuhkan kunci untuk membaca (atau menarik) kode sumbernya.
Tanpa kunci transport, seseorang tidak bisa:
- menarik kode dari server yang tidak mengizinkan global read access
- mendorong kode ke server manapun
- menjalankan server Monotone
Tanpa commit key, seseorang tidak bisa:
- komit kode apapun
Jika anda hanya ingin mengambil kode dari MTN, silakan lompat ke bagian selanjutnya Jika anda ingin menghasilkan kunci, baca berikut ini.
Sesuai konvensi, kunci diberi nama seperti alamat e-mail, namun e-mail yang sesuai tidak perlu ada Misalnya, kunci anda mungkin diberi nama:
- yourname@mail.i2p
- yourname-transport@mail.i2p
Monotone menyimpan kunci di bawah $HOME/.monotone/keys
pada file teks yang
diberi nama identik dengan kuncinya. Contohnya:
/home/complication/.monotone/keys/complication@mail.i2p
Untuk menghasilkan kunci transportasi dan komit, masukkan perintah berikut pada sebuah prompt:
$ mtn genkey yourname-transport@someplace
$ mtn genkey yourname@someplace
Monotone akan meminta password untuk melindungi kunci Anda. Anda sangat dianjurkan untuk menyetel password untuk commit key. Banyak pengguna akan membiarkan password kosong untuk kunci transport, terutama yang menjalankan Server monotone.
Memberi kepercayaan dan inisialisasi repositori anda
Model keamanan monotone membantu untuk memastikan bahwa tak seorang pun dapat dengan mudah meniru pengembang tanpa diketahui. Karena para pengembang dapat membuat kesalahan dan menjadi bocor identitasnya, hanya manual review dapat memastikan kualitas kode. Model kepercayaan monotone akan memastikan bahwa anda membaca diffs tepat. Ini tidak menggantikan pembacaan diffs.
Repositori monotone adalah sebuah file tunggal (database SQLite terkompresi) yang berisi semua kode sumber proyek dan sejarah.
Setelah mengimpor kunci para pengembang ke Monotone dan menyiapkan trust evaluation hook, Monotone akan mencegah kode yang tidak dipercaya diperiksa ke dalam workspace anda. Ada beberapa perintah yang tersedia untuk membersihkan kode yang tidak dipercaya dari workspace anda tetapi dalam praktiknya mereka sudah tidak diperlukan karena kebijakan akses push diterapkan.
Repositori bisa memiliki banyak cabang. Sebagai contoh, repositori kami memiliki beberapa cabang utama:
- i2p.i2p — I2P router dan program-program terkait
- i2p.www — Website proyek I2P proyek
- i2p.syndie — Syndie, alat forum terdistribusikan
Sesuai dengan konvensi, repositori I2P monotone dinamai i2p.mtn
. Sebelum menarik
kode sumber dari server, database untuk repositori anda akan perlu diinisialisasi.
Untuk menginisialisasi repositori lokal, Ubah ke dalam direktori yang anda inginkan
i2p.mtn
direktori file dan cabang disimpan dan melakukan
perintah:
$ mtn --db="i2p.mtn" db init
Mendapatkan dan menerapkan kunci pengembang
Kunci yang digunakan oleh pengembang untuk melakukan commit code sangat penting bagi kepercayaan evaluasi di Monotone. Transport key milik para pengembang lain hanya diperlukan untuk operator server monotone.
Commit key milik pengembang disediakan GPG-signed pada halaman lain.
Untuk mengimpor kunci pengembang setelah memverifikasi keaslian mereka, salin semua kunci ke
file yang baru. Buat file ini (misalnya keys.txt
) di direktori yang sama di mana i2p.mtn
berada. Impor key-nya dengan perintah:
$ mtn --db="i2p.mtn" read < keys.txt
Catatan: jangan menambahkan kunci $HOME/.monotone/keys
secara manual.
Menyiapkan trust evaluation hooks
Kebijakan kepercayaan monotone default terlalu lemah untuk persyaratan kami: setiap commit dipercaya secara default. Ini tidak bisa diterima di pengembangan I2P.
Ubahan ke direktori $HOME/.monotone
lalu buka file
monotonerc
dengan text editor. Copy dan paste kedua fungsi ini ke dalam file ini:
-- 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
Fungsi pertama menentukan persimpangan antara dua set, di dalam kasus kita revision's signers dan trusted signers.
Fungsi kedua menentukan kepercayaan dalam revisi tertentu, dengan memanggil fungsi dengan "signers" dan "trusted" sebagai argument. Jika persimpangannya bernilai null, revisi tidak dapat dipercaya. Jika persimpangannya tidak kosong, revisi dapat dipercaya. Jika tidak, revisinya tidak terpercaya.
Informasi lebih lanjut tentang Trust Evaluation Hooks dapat ditemukan dalam dokumentasi resmi monotone.
Menarik cabang i2p.i2p
, i2p.www
dan i2p.syndie
I2P disebarkan dengan tunnel yang dikonfigurasi untuk menunjuk ke server Monotone milik proyek I2P. Pastikan bahwa tunnel telah dimulai di dalam I2PTunnel sebelum mencoba menarik source code dari 127.0.0.1:8998.
Masukkan direktori di mana Anda menginisialisasi i2p.mtn
. Tergantung apakah anda
hanya ingin sumber kode I2P atau juga sumber kode untuk situs I2P atau Syndie, anda dapat
melakukan operasi pull
dengan cara yang berbeda.
Jika Anda hanya ingin source code I2P:
$ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"
Jika anda ingin semua cabang:
$ mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.*"
Melakukan pulling seperti contoh di atas dilakukan secara anonim dengan menspesifikasikan transport key kosong. Jika semua orang menarik secara anonim akan lebih sulit bagi penyerang yang meraih kendali atas server untuk secara selektif memberikan data yang dimodifikasi ke beberapa orang.
Memastikan bahwa evaluasi kepercayaan berfungsi
Untuk memverifikasi bahwa evaluasi kepercayaan berfungsi:
- Buat cadangan file
monotonerc
anda. - Modifikasi
monotonerc
dengan menetapkan variabel trusted_signers dengan cara berikut:local trusted_signers = {}
-
Dengan
monotonerc
dikonfigurasikan seperti di atas, Monotone tidak akan lagi mempercayai semua pihak. Konfirmasikan ini dengan mengubah ke direktori tempati2p.mtn
dibuat dan mencoba checkout cabang I2P:$ mtn --db="i2p.mtn" co --branch="i2p.i2p"
Sebuah direktori bernama
i2p.i2p
seharusnya tidak muncul. Anda seharusnya menjumpai banyak pesan error seperti: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
Jika anda puas dengan hasilnya, restore backup-nya
monotonerc
yang dibuat di atas. Jika anda tidak membuat backup seperti yang disarankan, baca kembali Menyiapkan trust evaluation hooks .Periksa wroking copy dari versi terbaru
Jika sebuah cabang sudah di-check out, lompat ke berikutnya bagian.
Ubah ke direktori tempat
i2p.mtn
berada. Di sana lakukan hal ini:- $
mtn --db="i2p.mtn" co --branch="i2p.i2p"
Checkout seharusnya selesai tanpa pesan error dan sebuah direktori bernama
i2p.i2p
seharusnya muncul di direktori saat ini. Selamat! Anda telah berhasil checkout source code I2P terbaru, siap untuk dikompilasi.Perbarui working copy anda ke versi terbaru
Jika anda belum melakukan ini, tarik kode dari server ke server lokal anda Repository Monotone. Untuk mencapai hal ini, ganti ke direktori di mana
i2p.mtn
berada dan lakukan perintah:- $
mtn --db="i2p.mtn" -k "" pull "mtn://127.0.0.1:8998?i2p.i2p"
Sekarang ganti ke direktori
i2p.i2p
anda, dan di sana lakukan perintah:- $
mtn update
Selama tidak ada error … Selamat! Anda telah berhasil update ke source code I2P terbaru. Kode tersebut seharusnya siap dikompilasi
Mengoperasikan Server Monotone
Mendapatkan dan menerapkan transport key milik pengembang
Sebagai operator server, anda mungkin ingin memberikan akses push ke pengembang tertentu.
Memberikan akses push dan pull
Secara default, server Monotone menolak semua akses.
Untuk memberikan akses pull ke semua klien, tetapkan hal berikut di
$HOME/.monotone/read-permissions
:pattern "*" allow "*"
Tidak ada yang tidak dapat mendorong kode ke server anda tanpa izin diberikan secara eksplisit. Memberikan akses push:
-
Tambahkan nama transport key milik pengguna ke
$HOME/.monotone/write-permissions
, sepertizzz-transport@mail.i2p complication-transport@mail.i2p
satu key per baris. - Impor transport key ke database anda. Prosedur untuk mengimpor transportasi key sama dengan mengimpor commit key yang dijelaskan di bagian Memperoleh dan menerapkan kunci pengembang .
Menjalankan Monotone d dalam mode server
Database terpisah harus digunakan untuk server Monotone anda karena monotone akan mengunci database saat disajikan kepada orang lain. Buat salinan database pengembangan anda, lalu mulai server dengan:
- $
mtn serve --bind="127.0.0.1:8998" --db="i2p.mtn" --key "myserver-transport@mail.i2p"
Supaya server anda agar dapat diakses orang lain dengan I2P, anda akan perlu untuk membuat server tunnel untuk itu. Gunakan jenis tunnel profil "Standar" dan "Bulk".
Perbedaan di dalam Debian GNU / Linux
Debian (dan distro lain) telah mengintegrasi Monotone ke framework dari daemons/services mereka. Walau server Monotone masih dapat dijalankan dengan "cara yang biasa" pada sistem Debian, melakukan hal itu "Debian way" mungkin lebih mudah.
Permission diberikan dengan mengedit file
/etc/monotone/read-permissions
dan/etc/monotone/write-permissions
. Anda juga perlu mengedit/etc/default/monotone
untuk membuat monotone dimulai secara otomatis saat boot atau untuk menyesuaikan host, port, atau lokasi database.