2.2
Modul `dev` dan Otomasi GitHub Actions
Direktori dev/ menyimpan perkakas kerja repository, bukan berkas yang dipasang ke perangkat pengguna. Dua berkas di dalamnya dipakai langsung oleh otomasi: dev/domainlist berisi satu domain per baris dev/domainlist:1-3, sedangkan dev/scripts/scan.py diunduh ke runner setiap kali workflow pemindaian berjalan .github/workflows/request.yml:911.
Berkas di dev/ dan pemakainya
Lima berkas membentuk permukaan modul ini. Setiap berkas punya titik masuk sendiri, dan hanya scan.py yang dipanggil oleh workflow.
| Berkas | Peran | Titik masuk |
|---|---|---|
dev/domainlist | daftar domain datar, satu entri per baris | dev/domainlist:1-3 |
dev/scripts/scan.py | resolve tiap hostname ke IP lalu menulis hosts- + nama berkas masukan | dev/scripts/scan.py:32-372 |
dev/scripts/fix.php | mengunduh ulang releases/hosts, resolve tiap domain, menyusun hosts-temp | dev/scripts/fix.php:22-333 |
dev/scripts/croncache.sh | menyegarkan public_html/hosts dari berkas terbit | dev/scripts/croncache.sh:4-64 |
dev/scripts/localhost.sh | menambahkan rules localhost ke /etc/hosts | dev/scripts/localhost.sh:5-125 |
Aliran berkasnya sederhana: domainlist memasok pemeriksaan duplikat, scan.py menghasilkan baris hosts, dan releases/hosts disebarkan oleh dua skrip lain ke tujuan masing-masing.
graph LR
list["dev/domainlist"] --> req["request.yml"]
req --> scan["scan.py"]
scan --> hosts["releases/hosts"]
hosts --> fix["fix.php"]
fix --> domain["domain.txt"]
domain --> temp["hosts-temp"]
temp --> final["hosts"]
hosts --> cron["croncache.sh"]
cron --> pub["public_html/hosts"]
local["localhost.sh"] --> etc["/etc/hosts"]
style list fill:#336791,color:#fff
style hosts fill:#336791,color:#fff
style pub fill:#336791,color:#fff
style scan fill:#2d7d46,color:#fff
style final fill:#2d7d46,color:#fff
style temp fill:#8b5cf6,color:#fff
style domain fill:#8b5cf6,color:#fff
style req fill:#f59e0b,color:#000
style cron fill:#f59e0b,color:#000
style local fill:#f59e0b,color:#000
style etc fill:#f59e0b,color:#000
%% fig: Ketergantungan berkas dev dengan alur otomasi
%% desc: domainlist memasok pemeriksaan duplikat, scan.py menghasilkan baris hosts, lalu fix.php dan croncache.sh menyebarkan berkas hosts ke tujuan masing-masing.scan.py: resolve domain ke IP
Fungsi execute(file) membuka masukan dan keluaran di direktori path[0], yaitu direktori skrip. Berkas keluaran diberi prefiks hosts-, sehingga masukan hasilsorted menghasilkan hosts-hasilsorted dev/scripts/scan.py:32-372.
Komentar kepala berkas menetapkan satu syarat urutan: domain induk harus ditulis di atas subdomainnya. Contoh yang salah menempatkan n1.domain.com sebelum domain.com dev/scripts/scan.py:13-216.
Setiap baris dirapikan lebih dulu dengan strip, rstrip("."), dan lower, lalu baris kosong dilewati dev/scripts/scan.py:39-427. Untuk hostname yang terisi, gethostbyname dipanggil; bila sebuah penanda grup sudah ada dan hostname cocok dengan grup itu, baris IP hostname disisipkan tepat di bawah penanda tersebut dev/scripts/scan.py:45-538.
Penulisan yang berhasil menaikkan lenLiveHostname, penulisan yang gagal menaikkan lenCantWrite dev/scripts/scan.py:61-689, dan exception dari gethostbyname menaikkan lenDieHostname sambil mencetak Domain {0} tidak aktif dev/scripts/scan.py:79-8310. Ketiga angka itu muncul sekaligus pada baris rekap dev/scripts/scan.py:8311.
sequenceDiagram
participant CLI as Pemanggil
participant Exec as execute
participant DNS as gethostbyname
participant Out as hosts-hasilsorted
CLI->>Exec: argv atau input nama berkas
Exec->>Exec: buka hostnameFile dan resultFile di path
loop setiap baris hostnameList
Exec->>Exec: strip, buang titik akhir, lower
alt hostname kosong
Exec->>Exec: continue
else hostname terisi
Exec->>DNS: gethostbyname hostname
alt resolusi berhasil
DNS-->>Exec: hostnameIp
Exec->>Out: sisipkan IP di bawah penanda grup
else resolusi gagal
Exec->>Exec: lenDieHostname bertambah
end
end
end
Exec-->>CLI: rekap Domain Aktif, Domain Mati, Gagal Ditulis
%% fig: Siklus satu berkas di scan.py
%% desc: execute membaca daftar hostname, me-resolve tiap entri, menyisipkan hasil ke berkas keluaran, lalu mencetak rekap penghitung.| Penghitung | Bertambah ketika | Label pada rekap |
|---|---|---|
lenLiveHostname | baris IP hostname berhasil ditulis | Domain Aktif |
lenDieHostname | resolusi melempar exception | Domain Mati |
lenCantWrite | penulisan ke berkas hasil gagal | Gagal Ditulis |
Masukan diambil dari argv[1]. Bila argumen tidak ada, skrip menanyakan nama berkas lewat input dev/scripts/scan.py:85-8912.
fix.php: menyusun ulang berkas hosts
fix.php menghapus hosts-temp dan domain.txt lama, mengambil releases/hosts dari raw.githubusercontent.com dengan curl, lalu menulis responsnya ke domain.txt dev/scripts/fix.php:22-333. Resolusi dilakukan fungsi domaintoip, yang menjalankan nslookup -timeout=1 -retry=1 dan mengambil baris Address: dev/scripts/fix.php:7-1013.
Setiap baris masukan diklasifikasikan. Baris yang diawali # disalin apa adanya, baris kosong diganti satu newline, dan baris lain dipecah menjadi token domain lalu di-resolve satu per satu sebelum ditulis sebagai IP domain dev/scripts/fix.php:51-5714. Di akhir, hosts-temp menggantikan hosts lewat rename dev/scripts/fix.php:120-12115.
sequenceDiagram
participant PHP as fix.php
participant Raw as raw.githubusercontent.com
participant NS as nslookup
participant Temp as hosts-temp
PHP->>PHP: unlink hosts-temp dan domain.txt
PHP->>Raw: curl releases/hosts
Raw-->>PHP: isi berkas
PHP->>PHP: fwrite ke domain.txt
loop setiap baris domain.txt
alt baris komentar atau kosong
PHP->>Temp: salin baris apa adanya
else baris berisi domain
PHP->>NS: domaintoip host dengan timeout 1
NS-->>PHP: baris Address
PHP->>Temp: tulis pasangan IP dan domain
end
end
PHP->>PHP: rename hosts-temp menjadi hosts
%% fig: Daur ulang hosts oleh fix.php
%% desc: fix.php mengunduh hosts terbit, me-resolve tiap domain, lalu membangun hosts-temp dan menggantikannya menjadi hosts.⚠️
fix.phpbersifat destruktif.unlink("hosts-temp")danunlink("domain.txt")berjalan di awal, danrename("hosts-temp", "hosts")menimpa berkashostsdi direktori kerja saat skrip dipanggil dev/scripts/fix.php:22-333 dev/scripts/fix.php:120-12115. Jalankan hanya di dalam direktori salinan, bukan di direktori sistem.
Skrip pendukung: croncache.sh dan localhost.sh
croncache.sh menyimpan tiga path tetap: public_html/hostsdefault, public_html/hostscheck, dan public_html/hosts dev/scripts/croncache.sh:4-64. Berkas terbit diunduh dengan wget ke hostsdefault, lalu cmp membandingkannya dengan hostscheck; bila status bernilai 0 skrip mencetak Tidak ada pembaruan dan berhenti dev/scripts/croncache.sh:8-1416. Bila berbeda, hostsdefault disalin ke hostscheck dan hosts, lalu lima baris header disisipkan dengan sed -i memakai date, $versi, dan wc -l sebagai sumber angka versi, tanggal, dan Total domain dev/scripts/croncache.sh:16-2817.
localhost.sh menampilkan empat pilihan (macOS, Linux, Android, keluar), membaca read n, lalu memilih cabang dengan case dev/scripts/localhost.sh:5-125. Ketiga cabang bekerja dengan pola yang sama: nomor baris penanda OPTIONAL] dicari memakai grep -n dan head -n 1, lalu rules localhost disisipkan di bawah baris itu dengan sudo sed -i dev/scripts/localhost.sh:14-1518.
⚠️
localhost.shmenulis langsung ke/etc/hostsdan memerlukansudo. Titik sisipnya bergantung pada penandaOPTIONAL]di berkas tersebut dev/scripts/localhost.sh:14-1518.
Workflow GitHub Actions
Ketiga workflow di .github/workflows/ bereaksi pada event issues bertipe labeled dan menyaring label lewat if pada level job, sehingga satu issue hanya memicu satu job .github/workflows/request.yml:1-919 .github/workflows/remove.yml:1-820 .github/workflows/bug.yml:1-821.
| Workflow | Label penjaga | commit yang dibuat |
|---|---|---|
.github/workflows/request.yml | solve-request | Add $DOMAIN to hosts (#$issue_number) |
.github/workflows/remove.yml | solve-remove | Remove $domain from domainlist (#$issue_number) |
.github/workflows/bug.yml | solve-bug | Fix $DOMAIN bug (#$issue_number) |
request.yml: dari issue ke berkas hosts
Domain diekstrak dengan jq dari .issue.body, diambil lewat awk setelah heading ### Domain, diubah ke huruf kecil, lalu disimpan sebagai DOMAIN di GITHUB_ENV .github/workflows/request.yml:14-2222. Pemeriksaan duplikat memakai grep -Fxiq pada dev/domainlist dan grep -Fqi pada penanda di releases/hosts, lalu menulis duplicate=true atau duplicate=false ke GITHUB_OUTPUT .github/workflows/request.yml:26-3223.
Issue ditutup pada kedua cabang, dengan komentar berbeda untuk duplikat dan untuk domain baru .github/workflows/request.yml:33-4424. Hanya pada cabang domain baru, $DOMAIN ditambahkan ke dev/domainlist .github/workflows/request.yml:45-4925. Instalasi tool berjalan dalam mode longgar karena set +e dipasang sebelum rangkaian go install, pip install, dan git clone .github/workflows/request.yml:56-5726.
Sembilan tahap enumerasi dijalankan berurutan: findomain, subfinder, amass, sublist3r, knockpy, dnsrecon, subbrute, dnssearch, dan sudomy, masing-masing menulis ke results/*.txt .github/workflows/request.yml:102-14827. Hasilnya digabung oleh skrip Python di dalam heredoc menjadi hasilunsorted .github/workflows/request.yml:155-18628, lalu diurutkan berdasarkan panjang baris menjadi hasilsorted .github/workflows/request.yml:187-19729.
python scan.py hasilsorted mengubah daftar itu menjadi hosts-hasilsorted, yang ditambahkan ke releases/hosts dengan tee -a .github/workflows/request.yml:198-20930. Baris kosong berlebih dimampatkan, lalu berkas commit dan di-push dengan secrets.UPDATE_TOKEN .github/workflows/request.yml:210-21431 .github/workflows/request.yml:215-22932.
sequenceDiagram
participant Issue as Issue
participant GH as request.yml
participant DL as dev/domainlist
participant Runner as ubuntu-latest
participant Hosts as releases/hosts
Issue->>GH: label solve-request
GH->>GH: Extract Domain dari issue.body
GH->>DL: grep -Fxiq DOMAIN
GH->>Hosts: grep -Fqi penanda domain
alt duplikat
GH->>Issue: Close Duplicate Issue
else domain baru
GH->>Issue: Close Issue
GH->>DL: append DOMAIN
GH->>Runner: pasang sembilan tool enumerasi
Runner->>Runner: tahap 1 sampai 9 menulis results
Runner->>Runner: merge ke hasilunsorted lalu sort ke hasilsorted
Runner->>Runner: scan.py hasilsorted
Runner->>Hosts: tee -a hosts-hasilsorted
GH->>Hosts: rapikan baris, commit, push dengan UPDATE_TOKEN
end
%% fig: Alur request.yml pada label solve-request
%% desc: Workflow mengekstrak domain, memeriksa duplikat di domainlist dan hosts, lalu menjalankan sembilan tool enumerasi, scan.py, dan commit.⚠️ Urutan langkah berarti issue ditutup sebelum
dev/domainlistdanreleases/hostsbenar-benar berubah .github/workflows/request.yml:33-4424 .github/workflows/request.yml:45-4925. Bila langkah setelahnya gagal, issue sudah tertutup walau domain belum masuk.
remove.yml dan bug.yml
remove.yml menghapus baris yang cocok dari releases/hosts ke releases/hosts.tmp .github/workflows/remove.yml:18-2233, menghapus pola yang sama dari dev/domainlist dengan sed -i .github/workflows/remove.yml:23-2734, lalu memampatkan baris kosong dari hosts.tmp kembali ke releases/hosts .github/workflows/remove.yml:28-3035. commit dibuat atas nama zksbot dan di-push dengan secrets.UPDATE_TOKEN .github/workflows/remove.yml:31-4336.
bug.yml memakai langkah yang lebih panjang: domain dihapus dari releases/hosts lewat sed dan mv .github/workflows/bug.yml:18-2637, lalu enumerasi sembilan tool dijalankan ulang, scan.py dipanggil, dan hasilnya ditambahkan ke releases/hosts .github/workflows/bug.yml:172-18138. Baris kosong dimampatkan .github/workflows/bug.yml:182-18539, lalu commit dan push dijalankan dengan hanya releases/hosts yang di-git add .github/workflows/bug.yml:186-19840.
⚠️
sed "/$domain/d"memperlakukan domain sebagai regex, bukan string tetap. Titik pada domain cocok dengan karakter apa pun, sehingga baris lain yang memuat pola serupa ikut terhapus .github/workflows/remove.yml:23-2734. Pemeriksaan duplikat direquest.ymljustru memakaigrep -F, yang memperlakukan domain sebagai string tetap .github/workflows/request.yml:26-3223.
Rincian siklus issue di luar berkas ini, termasuk template issue dan label yang memicunya, dibahas di Pipeline Domain dan Otomasi Issue. Perintah CLI yang membaca hasil akhirnya ada di Referensi Perintah CLI bebasid, dan cara sistem operasi membaca berkas hosts ada di Cara Kerja Hosts File.