Lompat ke konten
dokumentasi.id
Commit a70b2bb
v1
Star924

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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:91.

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.

BerkasPeranTitik masuk
dev/domainlistdaftar domain datar, satu entri per barisdev/domainlist:1-3
dev/scripts/scan.pyresolve tiap hostname ke IP lalu menulis hosts- + nama berkas masukandev/scripts/scan.py:32-37
dev/scripts/fix.phpmengunduh ulang releases/hosts, resolve tiap domain, menyusun hosts-tempdev/scripts/fix.php:22-33
dev/scripts/croncache.shmenyegarkan public_html/hosts dari berkas terbitdev/scripts/croncache.sh:4-6
dev/scripts/localhost.shmenambahkan rules localhost ke /etc/hostsdev/scripts/localhost.sh:5-12

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.
Fig. 1: Ketergantungan berkas dev dengan alur otomasidomainlist 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-37.

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-21.

Setiap baris dirapikan lebih dulu dengan strip, rstrip("."), dan lower, lalu baris kosong dilewati dev/scripts/scan.py:39-42. 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-53.

Penulisan yang berhasil menaikkan lenLiveHostname, penulisan yang gagal menaikkan lenCantWrite dev/scripts/scan.py:61-68, dan exception dari gethostbyname menaikkan lenDieHostname sambil mencetak Domain {0} tidak aktif dev/scripts/scan.py:79-83. Ketiga angka itu muncul sekaligus pada baris rekap dev/scripts/scan.py:83.

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.
Fig. 2: Siklus satu berkas di scan.pyexecute membaca daftar hostname, me-resolve tiap entri, menyisipkan hasil ke berkas keluaran, lalu mencetak rekap penghitung.
PenghitungBertambah ketikaLabel pada rekap
lenLiveHostnamebaris IP hostname berhasil ditulisDomain Aktif
lenDieHostnameresolusi melempar exceptionDomain Mati
lenCantWritepenulisan ke berkas hasil gagalGagal Ditulis

Masukan diambil dari argv[1]. Bila argumen tidak ada, skrip menanyakan nama berkas lewat input dev/scripts/scan.py:85-89.

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-33. Resolusi dilakukan fungsi domaintoip, yang menjalankan nslookup -timeout=1 -retry=1 dan mengambil baris Address: dev/scripts/fix.php:7-10.

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-57. Di akhir, hosts-temp menggantikan hosts lewat rename dev/scripts/fix.php:120-121.

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.
Fig. 3: Daur ulang hosts oleh fix.phpfix.php mengunduh hosts terbit, me-resolve tiap domain, lalu membangun hosts-temp dan menggantikannya menjadi hosts.

⚠️ fix.php bersifat destruktif. unlink("hosts-temp") dan unlink("domain.txt") berjalan di awal, dan rename("hosts-temp", "hosts") menimpa berkas hosts di direktori kerja saat skrip dipanggil dev/scripts/fix.php:22-33 dev/scripts/fix.php:120-121. 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-6. 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-14. 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-28.

localhost.sh menampilkan empat pilihan (macOS, Linux, Android, keluar), membaca read n, lalu memilih cabang dengan case dev/scripts/localhost.sh:5-12. 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-15.

⚠️ localhost.sh menulis langsung ke /etc/hosts dan memerlukan sudo. Titik sisipnya bergantung pada penanda OPTIONAL] di berkas tersebut dev/scripts/localhost.sh:14-15.

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-9 .github/workflows/remove.yml:1-8 .github/workflows/bug.yml:1-8.

WorkflowLabel penjagacommit yang dibuat
.github/workflows/request.ymlsolve-requestAdd $DOMAIN to hosts (#$issue_number)
.github/workflows/remove.ymlsolve-removeRemove $domain from domainlist (#$issue_number)
.github/workflows/bug.ymlsolve-bugFix $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-22. 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-32.

Issue ditutup pada kedua cabang, dengan komentar berbeda untuk duplikat dan untuk domain baru .github/workflows/request.yml:33-44. Hanya pada cabang domain baru, $DOMAIN ditambahkan ke dev/domainlist .github/workflows/request.yml:45-49. Instalasi tool berjalan dalam mode longgar karena set +e dipasang sebelum rangkaian go install, pip install, dan git clone .github/workflows/request.yml:56-57.

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-148. Hasilnya digabung oleh skrip Python di dalam heredoc menjadi hasilunsorted .github/workflows/request.yml:155-186, lalu diurutkan berdasarkan panjang baris menjadi hasilsorted .github/workflows/request.yml:187-197.

python scan.py hasilsorted mengubah daftar itu menjadi hosts-hasilsorted, yang ditambahkan ke releases/hosts dengan tee -a .github/workflows/request.yml:198-209. Baris kosong berlebih dimampatkan, lalu berkas commit dan di-push dengan secrets.UPDATE_TOKEN .github/workflows/request.yml:210-214 .github/workflows/request.yml:215-229.

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.
Fig. 4: Alur request.yml pada label solve-requestWorkflow mengekstrak domain, memeriksa duplikat di domainlist dan hosts, lalu menjalankan sembilan tool enumerasi, scan.py, dan commit.

⚠️ Urutan langkah berarti issue ditutup sebelum dev/domainlist dan releases/hosts benar-benar berubah .github/workflows/request.yml:33-44 .github/workflows/request.yml:45-49. 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-22, menghapus pola yang sama dari dev/domainlist dengan sed -i .github/workflows/remove.yml:23-27, lalu memampatkan baris kosong dari hosts.tmp kembali ke releases/hosts .github/workflows/remove.yml:28-30. commit dibuat atas nama zksbot dan di-push dengan secrets.UPDATE_TOKEN .github/workflows/remove.yml:31-43.

bug.yml memakai langkah yang lebih panjang: domain dihapus dari releases/hosts lewat sed dan mv .github/workflows/bug.yml:18-26, lalu enumerasi sembilan tool dijalankan ulang, scan.py dipanggil, dan hasilnya ditambahkan ke releases/hosts .github/workflows/bug.yml:172-181. Baris kosong dimampatkan .github/workflows/bug.yml:182-185, lalu commit dan push dijalankan dengan hanya releases/hosts yang di-git add .github/workflows/bug.yml:186-198.

⚠️ 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-27. Pemeriksaan duplikat di request.yml justru memakai grep -F, yang memperlakukan domain sebagai string tetap .github/workflows/request.yml:26-32.

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.