Lunatik adalah kerangka kerja untuk skrip kernel Linux dengan Lua. Ini disusun oleh interpreter LUA yang dimodifikasi untuk dijalankan dalam kernel; driver perangkat (ditulis dalam lua =)) dan alat baris perintah untuk memuat dan menjalankan skrip dan mengelola lingkungan runtime dari ruang pengguna; A C API untuk memuat dan menjalankan skrip dan mengelola lingkungan runtime dari kernel; dan Lua API untuk mengikat fasilitas kernel ke skrip Lua.
Berikut adalah contoh driver perangkat karakter yang ditulis di LUA menggunakan lunatik untuk menghasilkan karakter dicetak ASCII acak:
-- /lib/modules/lua/passwd.lua
--
-- implements /dev/passwd for generate passwords
-- usage: $ sudo lunatik run passwd
-- $ head -c <width> /dev/passwd
local device = require ( " device " )
local linux = require ( " linux " )
local function nop () end -- do nothing
local s = linux . stat
local driver = { name = " passwd " , open = nop , release = nop , mode = s . IRUGO }
function driver : read () -- read(2) callback
-- generate random ASCII printable characters
return string.char ( linux . random ( 32 , 126 ))
end
-- creates a new character device
device . new ( driver )Instal dependensi (di sini untuk Debian/Ubuntu, untuk disesuaikan dengan distribusi seseorang):
sudo apt install git build-essential lua5.4 dwarves clang llvm libelf-dev linux-headers- $( uname -r ) linux-tools-common linux-tools- $( uname -r ) pkg-config libpcap-dev m4 Kompilasi dan instal lunatik :
LUNATIK_DIR= ~ /lunatik # to be adapted
mkdir " ${LUNATIK_DIR} " ; cd " ${LUNATIK_DIR} "
git clone --depth 1 --recurse-submodules https://github.com/luainkernel/lunatik.git
cd lunatik
make
sudo make install Setelah selesai, skrip debian_kernel_postinst_lunatik.sh dari alat/dapat disalin ke /etc/kernel/postinst.d/ : ini memastikan lunatik (dan juga libs yang dibutuhkan xdp ) akan dikompilasi pada peningkatan kernel.
sudo lunatik # execute Lunatik REPL
Lunatik 3.5 Copyright (C) 2023-2024 ring-0 Ltda.
> return 42 -- execute this line in the kernel
42
usage: lunatik [load | unload | reload | status | list] [run | spawn | stop < script > ]load : Muat modul kernel lunatikunload : Bongkar Modul Kernel Lunatikreload : Muat Ulang Modul Kernel Lunatikstatus : Tunjukkan modul kernel Lunatik mana yang saat ini dimuatlist : Tunjukkan lingkungan runtime mana yang sedang berjalan saat inirun : Buat lingkungan runtime baru untuk menjalankan skrip /lib/modules/lua/<script>.luaspawn : Buat lingkungan runtime baru dan menelurkan utas untuk menjalankan skrip /lib/modules/lua/<script>.luastop : Hentikan lingkungan runtime yang dibuat untuk menjalankan skrip <script>default : Mulai repl (loop baca -eval -cap) Lunatik 3.4 didasarkan pada LUA 5.4 yang diadaptasi untuk dijalankan di kernel.
Lunatik tidak mendukung aritmatika titik mengambang, sehingga tidak mendukung __div atau __pow metamethods dan nomor tipe hanya memiliki integer subtipe.
Lunatik tidak mendukung perpustakaan IO dan OS, dan pengidentifikasi yang diberikan dari perpustakaan berikut:
Lunatik memodifikasi pengidentifikasi berikut:
"Lua 5.4-kernel" ."/lib/modules/lua/?.lua;/lib/modules/lua/?/init.lua" .Lunatik tidak mendukung lual_stream, lual_execResult, lual_fileresult, luaopen_io dan luaopen_os.
Lunatik memodifikasi lual_openlibs untuk menghapus luaopen_io dan luaopen_os.
#include <lunatik.h> int lunatik_runtime ( lunatik_object_t * * pruntime , const char * script , bool sleep ); lunatik_runtime () menciptakan lingkungan runtime baru kemudian memuat dan menjalankan skrip /lib/modules/lua/<script>.lua sebagai titik masuk untuk lingkungan ini. Itu hanya harus dipanggil dari konteks proses . Lingkungan runtime adalah objek Lunatik yang memegang negara bagian Lua. Objek Lunatik adalah Lua UserData khusus yang juga memiliki jenis kunci dan penghitung referensi. Jika sleep itu benar , lunatik_runtime () akan menggunakan mutex untuk mengunci lingkungan runtime dan bendera GFP_Kernel untuk mengalokasikan memori baru nanti pada panggilan lunatik_run (). Kalau tidak, itu akan menggunakan spinlock dan gfp_atomic. lunatik_runtime () membuka perpustakaan standar LUA yang ada di Lunatik. Jika berhasil, lunatik_runtime () menetapkan alamat yang ditunjuk oleh ruang ekstra pruntime dan Lua dengan pointer untuk lingkungan runtime yang baru dibuat, menetapkan penghitung referensi ke 1 dan kemudian mengembalikan 0 . Kalau tidak, ia mengembalikan -ENOMEM , jika memori yang tidak mencukupi tersedia; atau -EINVAL , jika gagal memuat atau menjalankan script .
-- /lib/modules/lua/mydevice.lua
function myread ( len , off )
return " 42 "
end static lunatik_object_t * runtime ;
static int __init mydevice_init ( void )
{
return lunatik_runtime ( & runtime , "mydevice" , true);
} int lunatik_stop ( lunatik_object_t * runtime ); lunatik_stop () menutup negara Lua yang dibuat untuk lingkungan runtime ini dan mengurangi penghitung referensi. Setelah penghitung referensi dikurangi menjadi nol, tipe kunci dan memori yang dialokasikan untuk lingkungan runtime dilepaskan. Jika lingkungan runtime telah dirilis, ia mengembalikan 1 ; Kalau tidak, ia kembali 0 .
void lunatik_run ( lunatik_object_t * runtime , < inttype > ( * handler )(...), < inttype > & ret , ...); lunatik_run () mengunci lingkungan runtime dan memanggil handler melewati negara bagian Lua yang terkait sebagai argumen pertama diikuti oleh argumen variadik. Jika keadaan LUA telah ditutup, ret diatur dengan -ENXIO ; Kalau tidak, ret diatur dengan hasil panggilan handler(L, ...) . Kemudian, ia mengembalikan tumpukan Lua dan membuka kunci lingkungan runtime . Itu didefinisikan sebagai makro.
static int l_read ( lua_State * L , char * buf , size_t len , loff_t * off )
{
size_t llen ;
const char * lbuf ;
lua_getglobal ( L , "myread" );
lua_pushinteger ( L , len );
lua_pushinteger ( L , * off );
if ( lua_pcall ( L , 2 , 2 , 0 ) != LUA_OK ) { /* calls myread(len, off) */
pr_err ( "%sn" , lua_tostring ( L , -1 ));
return - ECANCELED ;
}
lbuf = lua_tolstring ( L , -2 , & llen );
llen = min ( len , llen );
if ( copy_to_user ( buf , lbuf , llen ) != 0 )
return - EFAULT ;
* off = ( loff_t ) luaL_optinteger ( L , -1 , * off + llen );
return ( ssize_t ) llen ;
}
static ssize_t mydevice_read ( struct file * f , char * buf , size_t len , loff_t * off )
{
ssize_t ret ;
lunatik_object_t * runtime = ( lunatik_object_t * ) f -> private_data ;
lunatik_run ( runtime , l_read , ret , buf , len , off );
return ret ;
} void lunatik_getobject ( lunatik_object_t * object ); lunatik_getObject () menambah penghitung referensi object ini (misalnya, lingkungan runtime ).
int lunatik_putobject ( lunatik_object_t * object ); lunatik_putobject () mengurangi penghitung referensi object ini (misalnya, lingkungan runtime ). Jika object telah dirilis, ia mengembalikan 1 ; Kalau tidak, ia kembali 0 .
lunatik_object_t * lunatik_toruntime ( lua_State * L ); lunatik_toruntime () Mengembalikan lingkungan runtime yang dirujuk oleh ruang ekstra L
Perpustakaan lunatik menyediakan dukungan untuk memuat dan menjalankan skrip dan mengelola lingkungan runtime dari Lua.
lunatik.runtime(script [, sleep]) lunatik.runtime () menciptakan lingkungan runtime baru kemudian memuat dan menjalankan skrip /lib/modules/lua/<script>.lua sebagai titik masuk untuk lingkungan ini. Ini mengembalikan objek Lunatik yang mewakili lingkungan runtime . Jika sleep benar atau dihilangkan, itu akan menggunakan mutex dan gfp_kernel; Kalau tidak, itu akan menggunakan spinlock dan gfp_atomic. lunatik.runtime () membuka perpustakaan standar LUA yang ada di Lunatik.
runtime:stop() Runtime: Stop () Menghentikan lingkungan runtime dan menghapus rujukannya dari objek runtime.
runtime:resume([obj1, ...]) Runtime: resume () melanjutkan eksekusi runtime . Nilai -nilai obj1, ... disahkan sebagai argumen ke fungsi yang dikembalikan pada pembuatan runtime . Jika runtime telah menghasilkan, resume() restart; Nilai obj1, ... disahkan sebagai hasil dari hasil.
Perpustakaan device menyediakan dukungan untuk menulis driver perangkat karakter di LUA.
device.new(driver) device.new () Mengembalikan objek device baru dan menginstal driver di sistem. driver harus didefinisikan sebagai tabel yang berisi bidang berikut:
name : String mendefinisikan nama perangkat; Ini digunakan untuk membuat file perangkat (misalnya, /dev/<name> ). Tabel driver mungkin secara opsional berisi bidang -bidang berikut:
read : Fungsi Callback Untuk menangani operasi baca pada file perangkat. Ini menerima tabel driver sebagai argumen pertama diikuti oleh dua bilangan bulat, length yang akan dibaca dan file offset . Ini harus mengembalikan string dan, secara opsional, updated offset . Jika panjang string yang dikembalikan lebih besar dari length yang diminta, string akan dikoreksi dengan length itu. Jika updated offset tidak dikembalikan, offset akan diperbarui dengan offset + length .write : Fungsi panggilan balik untuk menangani operasi tulis pada file perangkat. Ini menerima tabel driver sebagai argumen pertama yang diikuti oleh string yang akan ditulis dan bilangan bulat sebagai file offset . Mungkin mengembalikan secara opsional length tertulis diikuti oleh updated offset . Jika panjang yang dikembalikan lebih besar dari length yang diminta, panjang yang dikembalikan akan diperbaiki. Jika updated offset tidak dikembalikan, offset akan diperbarui dengan offset + length .open : Fungsi Callback Untuk menangani operasi terbuka pada file perangkat. Ia menerima tabel driver dan diharapkan tidak mengembalikan apa pun.release : Fungsi panggilan balik untuk menangani operasi rilis pada file perangkat. Ia menerima tabel driver dan diharapkan tidak mengembalikan apa pun.mode : Integer yang menentukan mode file perangkat. Jika panggilan balik operasi tidak ditentukan, device mengembalikan -ENXIO ke VFS pada aksesnya.
device.stop(dev) , dev:stop() device.stop () menghapus driver perangkat yang ditentukan oleh objek dev dari sistem.
Perpustakaan linux menyediakan dukungan untuk beberapa fasilitas kernel Linux.
linux.random([m [, n]])linux.random () meniru perilaku math.random, tetapi mengikat <linux/random.h> get_random_u32 () dan get_random_u64 () API.
Ketika dipanggil tanpa argumen, menghasilkan bilangan bulat dengan semua bit (pseudo) secara acak. Ketika dipanggil dengan dua bilangan bulat m dan n , linux.random () mengembalikan integer pseudo-acak dengan distribusi seragam dalam kisaran [m, n] . Panggilan math.random(n) , untuk n positif, setara dengan math.random(1, n) .
linux.statLinux.stat adalah tabel yang mengekspor <linux/stat.h> bendera integer ke lua.
"IRWXUGO" : Izin untuk membaca , menulis, dan mengeksekusi untuk pengguna , grup , dan lainnya ."IRUGO" : Izin hanya untuk membaca untuk pengguna , grup , dan lainnya ."IWUGO" : izin hanya untuk menulis untuk pengguna , grup , dan lainnya ."IXUGO" : Izin hanya untuk dieksekusi untuk pengguna , grup , dan lainnya . linux.schedule([timeout [, state]]) Linux.schedule () menetapkan state tugas saat ini dan membuatnya tidur sampai timeout milidetik telah berlalu. Jika timeout dihilangkan, ia menggunakan MAX_SCHEDULE_TIMEOUT . Jika state dihilangkan, ia menggunakan task.INTERRUPTIBLE .
linux.taskLinux.Task adalah tabel yang mengekspor bendera status tugas ke Lua.
"RUNNING" : Tugas mengeksekusi pada CPU atau menunggu untuk dieksekusi."INTERRUPTIBLE" : Tugas sedang menunggu sinyal atau sumber daya (tidur)."UNINTERRUPTIBLE" : berperilaku seperti "interruptible" dengan pengecualian bahwa sinyal tidak akan membangunkan tugas."KILLABLE" : berperilaku seperti "tidak terputus" dengan pengecualian bahwa sinyal fatal akan membangunkan tugas itu."IDLE" : Behaves Like "Unintertrible" dengan pengecualian bahwa ia menghindari akuntansi Loadavg. linux.time()linux.time () Mengembalikan waktu saat ini dalam nanodetik sejak zaman.
linux.errnolinux.errno adalah tabel yang mengekspor <uapi/asm-generic/errno-base.h> bendera ke lua.
"PERM" : Operasi tidak diizinkan."NOENT" : Tidak ada file atau direktori seperti itu."SRCH" : Tidak ada proses seperti itu."INTR" : Panggilan sistem yang terputus."IO" : I/O Error."NXIO" : Tidak ada perangkat atau alamat seperti itu."2BIG" :, Daftar argumen terlalu lama."NOEXEC" : EXEC FORMAT ERROR."BADF" : Nomor file yang buruk."CHILD" : Tidak ada proses anak."AGAIN" : Coba lagi."NOMEM" : Keluar dari memori."ACCES" : Izin ditolak."FAULT" : Alamat Buruk."NOTBLK" : Diperlukan perangkat blok."BUSY" : Perangkat atau sumber daya sibuk."EXIST" : ada file."XDEV" : tautan lintas-perangkat."NODEV" : Tidak ada perangkat seperti itu."NOTDIR" : bukan direktori."ISDIR" : adalah direktori."INVAL" : Argumen tidak valid."NFILE" : tabel file overflow."MFILE" : Terlalu banyak file terbuka."NOTTY" : bukan mesin tik."TXTBSY" : File teks sibuk."FBIG" : File terlalu besar."NOSPC" : Tidak ada ruang yang tersisa di perangkat."SPIPE" : pencarian ilegal."ROFS" : Sistem file hanya baca."MLINK" : Terlalu banyak tautan."PIPE" : Pipa yang rusak."DOM" : Argumen matematika di luar domain Func."RANGE" : Hasil matematika tidak dapat diwakili. linux.hton16(num)linux.hton16 () mengonversi pesanan byte host menjadi pesanan byte jaringan untuk bilangan bulat 16-bit.
linux.hton32(num)linux.hton32 () mengonversi pesanan byte host menjadi urutan byte jaringan untuk bilangan bulat 32-bit.
linux.hton64(num)linux.hton64 () mengonversi pesanan byte host menjadi pesanan byte jaringan untuk bilangan bulat 64-bit.
linux.ntoh16(num)linux.ntoh16 () Mengubah urutan byte jaringan menjadi tuan rumah pesanan byte untuk bilangan bulat 16-bit.
linux.ntoh32(num)linux.ntoh32 () Mengubah urutan byte jaringan menjadi tuan rumah pesanan byte untuk bilangan bulat 32-bit.
linux.ntoh64(num)linux.ntoh64 () Mengubah urutan byte jaringan menjadi tuan rumah pesanan byte untuk bilangan bulat 64-bit.
linux.htobe16(num)Linux.htobe16 () mengubah urutan byte host menjadi urutan byte besar-endian untuk bilangan bulat 16-bit.
linux.htobe32(num)Linux.htobe32 () mengubah urutan byte host menjadi urutan byte besar-endian untuk bilangan bulat 32-bit.
linux.htobe64(num)linux.htobe64 () mengubah urutan byte host menjadi urutan byte besar untuk bilangan bulat 64-bit.
linux.be16toh(num)linux.be16toh () mengkonversi urutan byte besar-endian untuk menjadi tuan rumah pesanan byte untuk bilangan bulat 16-bit.
linux.be32toh(num)linux.be32toh () mengkonversi urutan byte besar-endian untuk menjadi tuan rumah pesanan byte untuk bilangan bulat 32-bit.
linux.be64toh(num)linux.be64toh () mengkonversi urutan byte besar-endian untuk menjadi tuan rumah pesanan byte untuk bilangan bulat 64-bit.
linux.htole16(num)linux.htole16 () mengubah urutan byte host menjadi urutan byte kecil-endian untuk bilangan bulat 16-bit.
linux.htole32(num)Linux.htole32 () mengubah urutan byte host menjadi urutan byte kecil-endian untuk bilangan bulat 32-bit.
linux.htole64(num)linux.htole64 () mengubah urutan byte host menjadi urutan byte kecil-endian untuk bilangan bulat 64-bit.
linux.le16toh(num)linux.le16toh () mengonversi urutan byte kecil-endian untuk menjadi tuan rumah pesanan byte untuk bilangan bulat 16-bit.
linux.le32toh(num)linux.le32toh () mengonversi urutan byte kecil-endian untuk menjadi tuan rumah pesanan byte untuk bilangan bulat 32-bit.
linux.le64toh(num)linux.le64toh () mengonversi urutan byte kecil-endian untuk menjadi tuan rumah pesanan byte untuk bilangan bulat 64-bit.
Perpustakaan notifier memberikan dukungan untuk Rantai Pemberian Kernel.
notifier.keyboard(callback) notifier.keyboard () Mengembalikan objek notifier Keyboard baru dan menginstalnya di sistem. Fungsi callback dipanggil setiap kali peristiwa keyboard konsol terjadi (misalnya, kunci telah ditekan atau dirilis). callback ini menerima argumen berikut:
event : Acara yang tersedia didefinisikan oleh tabel notifier.kbd.down : true , jika tombol ditekan; false , jika dirilis.shift : true , jika kunci shift diadakan; false , jika tidak.key : Kode key atau kunci tergantung pada event . Fungsi callback mungkin mengembalikan nilai yang ditentukan oleh tabel pemberitahuan.
notifier.kbdNotifier.KBD adalah tabel yang mengekspor bendera KBD ke Lua.
"KEYCODE" : Kode keyboard, dipanggil sebelum yang lain."UNBOUND_KEYCODE" : Kode keyboard keycode yang tidak terikat pada yang lain."UNICODE" : Keyboard Unicode."KEYSYM" : Keyboard Keysym ."POST_KEYSYM" : Dipanggil setelah interpretasi keyboard keyboard . notifier.netdevice(callback) notifier.netDevice () Mengembalikan objek NetDevice notifier baru dan menginstalnya di sistem. Fungsi callback dipanggil setiap kali peristiwa NetDevice konsol terjadi (misalnya, antarmuka jaringan telah terhubung atau terputus). callback ini menerima argumen berikut:
event : Acara yang tersedia ditentukan oleh tabel Notifier.Netdev.name : Nama perangkat. Fungsi callback mungkin mengembalikan nilai yang ditentukan oleh tabel pemberitahuan.
notifier.netdevNotifier.netdev adalah tabel yang mengekspor bendera NetDev ke Lua.
notifier.notifyNotifier.Notify adalah tabel yang mengekspor memberi tahu bendera ke Lua.
"DONE" : tidak peduli."OK" : cocok untukku."BAD" : Tindakan buruk/veto."STOP" : Bersih cara untuk kembali dari pemberitahuan dan hentikan panggilan lebih lanjut. notfr:delete() notfr: delete () menghapus notifier yang ditentukan oleh objek notfr dari sistem.
Perpustakaan socket memberikan dukungan untuk penanganan jaringan kernel. Perpustakaan ini terinspirasi oleh proyek GSOC Chengzhi Tan.
socket.new(family, type, protocol) socket.new () membuat objek socket baru. Fungsi ini menerima argumen berikut:
family : Alamat keluarga yang tersedia ditentukan oleh tabel soket.AF.sock : Tipe yang tersedia ada di tabel soket.protocol : Protokol yang tersedia ditentukan oleh tabel socket.ipproto. socket.afSocket.af adalah meja yang mengekspor alamat keluarga (AF) ke Lua.
"UNSPEC" : tidak ditentukan."UNIX" : Soket Domain UNIX."LOCAL" : Nama POSIX untuk AF_Unix."INET" : Protokol IP Internet."AX25" : Amatir Radio Ax.25."IPX" : Novell IPX."APPLETALK" : Appletalk DDP."NETROM" : Net/ROM radio amatir."BRIDGE" : Jembatan Multiprotocol."ATMPVC" : ATM PVC."X25" : Dicadangkan untuk proyek X.25."INET6" : IP versi 6."ROSE" : Amatir Radio X.25 PLP."DEC" : Dicadangkan untuk proyek Decnet."NETBEUI" : Dicadangkan untuk proyek 802.2LLC."SECURITY" : Security Callback Pseudo AF."KEY" : API Manajemen Kunci PF_KEY."NETLINK" : NetLink."ROUTE" : Alias untuk meniru 4.4BSD."PACKET" : Keluarga Paket."ASH" : Ash."ECONET" : Acorn Econet."ATMSVC" : ATM SVCS."RDS" : Soket RDS."SNA" : Proyek Linux SNA (Nutters!)."IRDA" : Soket IRDA."PPPOX" : Soket PPPOX."WANPIPE" : Wanpipe API Sockets."LLC" : Linux LLC."IB" : Alamat Infiniband asli."MPLS" : MPLS."CAN" : Jaringan Area Pengontrol."TIPC" : Soket TIPC."BLUETOOTH" : Soket Bluetooth."IUCV" : Soket IUCV."RXRPC" : Soket RXRPC."ISDN" : Soket Misdn."PHONET" : Soket fonet."IEEE802154" : Soket IEEE802154."CAIF" : Soket CAIF."ALG" : Soket Algoritma."NFC" : Soket NFC."VSOCK" : VSOCKETS."KCM" : Kernel Connection Multiplexor."QIPCRTR" : Router IPC Qualcomm."SMC" : Nomor cadangan untuk keluarga protokol PF_SMC yang menggunakan kembali keluarga alamat AF_INET."XDP" : Soket XDP."MCTP" : Protokol Transport Komponen Manajemen."MAX" : Maksimum. socket.socksocket.sock adalah meja yang mengekspor jenis soket (kaus kaki):
"STREAM" : Stream (koneksi) soket."DGRAM" : soket datagram (conn.less)."RAW" : Soket mentah."RDM" : Pesan yang Diberikan dengan andal."SEQPACKET" : Soket paket berurutan."DCCP" : Soket Protokol Kontrol Konesponden Datagram."PACKET" : cara spesifik Linux untuk mendapatkan paket di level dev.dan bendera (kaus kaki):
"CLOEXEC" : N/A."NONBLOCK" : n/a. socket.ipprotoSocket.ipproto adalah tabel yang mengekspor protokol IP (IppRoto) ke Lua.
"IP" : Protokol Dummy untuk TCP."ICMP" : Protokol Pesan Kontrol Internet."IGMP" : Protokol Manajemen Grup Internet."IPIP" : terowongan IPIP (terowongan KA9Q yang lebih tua menggunakan 94)."TCP" : Protokol Kontrol Transmisi."EGP" : Protokol Gateway Eksterior."PUP" : PUP Protocol."UDP" : Protokol Datagram Pengguna."IDP" : XNS IDP Protocol."TP" : Jadi transportasi protokol kelas 4."DCCP" : Protokol Kontrol Kemacetan Datagram."IPV6" : IPv6-in-IPV4 Tunneling."RSVP" : Protokol RSVP."GRE" : Cisco GRE Tunnels (RFC 1701.1702)."ESP" : Protokol Payload Keamanan Enkapsulasi."AH" : Protokol Header Otentikasi."MTP" : Protokol Transportasi Multicast."BEETPH" : Header Pseudo Opsi IP untuk bit."ENCAP" : header enkapsulasi."PIM" : Protokol Multicast Independen."COMP" : Protokol Header Kompresi."SCTP" : Protokol Transport Kontrol Aliran."UDPLITE" : UDP-Lite (RFC 3828)."MPLS" : MPLS di IP (RFC 4023)."ETHERNET" : Encapsulation Ethernet-Within-IPV6."RAW" : Paket IP Raw."MPTCP" : Koneksi TCP multipath. sock:close() kaus kaki: tutup () menghilangkan objek sock dari sistem.
sock:send(message, [addr [, port]]) Sock: Kirim () Mengirim message string melalui sock soket. Jika keluarga alamat sock adalah af.INET , maka ia mengharapkan argumen berikut:
addr : integer menjelaskan alamat IPv4 tujuan.port : integer menggambarkan port IPv4 tujuan.Jika tidak:
addr : String dikemas yang menggambarkan alamat tujuan. sock:receive(length, [flags [, from]]) kaus kaki: terima () menerima string dengan byte panjang hingga length melalui sock soket. Bendera pesan yang tersedia ditentukan oleh tabel socket.msg. Jika from itu true , ia mengembalikan pesan yang diterima diikuti oleh alamat peer. Kalau tidak, hanya mengembalikan pesan yang diterima.
socket.msgSocket.msg adalah tabel yang mengekspor bendera pesan ke Lua.
"OOB" : N/A."PEEK" : n/a."DONTROUTE" : n/a."TRYHARD" : Sinonim untuk "DONTROUTE" untuk Decnet."CTRUNC" : n/a."PROBE" : Jangan kirim. Hanya Jalur Penyelidikan Fe untuk MTU."TRUNC" : n/a."DONTWAIT" : nonblocking io."EOR" : Akhir catatan."WAITALL" : Tunggu permintaan penuh."FIN" : N/A."SYN" : n/a."CONFIRM" : Konfirmasi validitas jalur."RST" : N/A."ERRQUEUE" : Ambil pesan dari antrian kesalahan."NOSIGNAL" : Jangan menghasilkan sigpipe."MORE" : Pengirim akan mengirim lebih banyak."WAITFORONE" : RecVMMMG (): Blokir sampai 1+ paket tersedia."SENDPAGE_NOPOLICY" : sendPage () internal: jangan terapkan kebijakan."SENDPAGE_NOTLAST" : sendPage () internal: bukan halaman terakhir."BATCH" : sendMmsg (): Lebih banyak pesan datang."EOF" : N/A."NO_SHARED_FRAGS" : sendPage () internal: halaman frag tidak dibagikan."SENDPAGE_DECRYPTED" : sendPage () Internal: halaman dapat membawa teks biasa dan memerlukan enkripsi."ZEROCOPY" : Gunakan data pengguna di jalur kernel."FASTOPEN" : Kirim data di TCP Syn."CMSG_CLOEXEC" : Atur close_on_exec untuk deskriptor file yang diterima melalui SCM_RIGHTS. sock:bind(addr [, port]) Sock: Bind () mengikat sock soket ke alamat yang diberikan. Jika keluarga alamat sock adalah af.INET , maka ia mengharapkan argumen berikut:
addr : integer menggambarkan alamat host IPv4.port : integer menggambarkan port host IPv4.Jika tidak:
addr : String yang dikemas menggambarkan alamat host. sock:listen([backlog]) Sock: Listen () Pindahkan sock soket ke keadaan mendengarkan.
backlog : Ukuran antrian koneksi yang tertunda. Jika dihilangkan, ia menggunakan Somaxconn sebagai default. sock:accept([flags]) Sock: Accept () menerima koneksi pada sock soket. Ini mengembalikan objek socket baru. Bendera yang tersedia ada di tabel soket.
sock:connect(addr [, port] [, flags]) Sock: Connect () Menghubungkan sock soket ke alamat addr . Jika keluarga alamat sock adalah af.INET , maka ia mengharapkan argumen berikut:
addr : integer menjelaskan alamat IPv4 tujuan.port : integer menggambarkan port IPv4 tujuan.Jika tidak:
addr : String dikemas yang menggambarkan alamat tujuan.Bendera yang tersedia ada di tabel soket.
Untuk soket datagram, addr adalah alamat yang dikirim oleh datagram secara default, dan satu -satunya alamat dari mana datagram diterima. Untuk soket aliran, upaya untuk terhubung ke addr .
sock:getsockname() Sock: getSockName () Dapatkan alamat yang diikat sock soket. Jika keluarga alamat sock adalah af.INET , maka ia mengembalikan yang berikut:
addr : integer menggambarkan alamat IPv4 yang dibatasi.port : integer menggambarkan port IPv4 yang dibatasi.Jika tidak:
addr : String dikemas yang menggambarkan alamat yang dibatasi. sock:getpeername() Sock: getPeerName () Dapatkan alamat yang terhubung dengan sock soket. Jika keluarga alamat sock adalah af.INET , maka ia mengembalikan yang berikut:
addr : integer menggambarkan alamat IPv4 peer.port : integer menggambarkan port IPv4 rekan.Jika tidak:
addr : String dikemas yang menggambarkan alamat peer. Perpustakaan socket.inet menyediakan dukungan untuk soket IPv4 tingkat tinggi.
inet.tcp() inet.tcp () membuat socket baru menggunakan AF.Inet Address Family, Sock.stream Type dan Ipproto.tcp Protocol. Ini mengesampingkan metode socket untuk menggunakan alamat sebagai notasi angka dan titik (misalnya, "127.0.0.1" ), bukan bilangan bulat.
inet.udp() inet.udp () membuat socket baru menggunakan af.inet alamat keluarga, sock.dgram tipe dan protokol ipproto.udp. Ini mengesampingkan metode socket untuk menggunakan alamat sebagai notasi angka dan titik (misalnya, "127.0.0.1" ), bukan bilangan bulat.
udp:receivefrom(length [, flags]) UDP: terima dari () hanyalah alias untuk sock:receive(length, flags, true) .
Perpustakaan rcu memberikan dukungan untuk mekanisme sinkronisasi pembaruan pembaruan (RCU) kernel. Perpustakaan ini terinspirasi oleh proyek GSOC Caio Messias.
rcu.table([size]) rcu.table () membuat objek rcu.table baru yang mengikat tabel hash generik kernel. Fungsi ini menerima sebagai argumen jumlah ember yang dibulatkan ke daya berikutnya dari 2. Ukuran default adalah 1024 . Kunci harus berupa string dan nilai harus berupa objek Lunatik atau nihil.
Perpustakaan thread memberikan dukungan untuk primitif utas kernel.
thread.run(runtime, name) thread.run () Membuat objek thread baru dan membangunkannya. Fungsi ini menerima argumen berikut:
runtime : Lingkungan runtime untuk menjalankan tugas di utas kernel yang dibuat. Tugas harus ditentukan dengan mengembalikan fungsi pada skrip yang dimuat di lingkungan runtime .name : String mewakili nama untuk utas (misalnya, seperti yang ditunjukkan pada ps ). thread.shouldstop() thread.shouldstop () mengembalikan true jika thread.stop () dipanggil; Kalau tidak, ia kembali false .
thread.current() thread.current () Mengembalikan objek thread yang mewakili tugas saat ini.
thrd:stop() thrd: stop () sets thread.shouldstop () di utas thrd untuk mengembalikan true, bangun thrd , dan menunggu untuk keluar.
thrd:task() Thrd: Task () Mengembalikan tabel yang berisi informasi tugas dari thread ini (misalnya, "CPU", "perintah", "pid" dan "tgid").
Perpustakaan fib memberikan dukungan untuk basis informasi penerusan kernel.
fib.newrule(table, priority)fib.newrule () mengikat kernel fib_nl_newrule API; Ini menciptakan aturan FIB baru yang cocok dengan tabel perutean yang ditentukan dengan priorioty yang ditentukan. Fungsi ini mirip dengan aturan IP perintah ruang pengguna yang ditambahkan yang disediakan oleh iProute2.
fib.delrule(table, priority)fib.delrule () mengikat Kernel FIB_NL_DELRULE API; Ini menghilangkan aturan FIB yang cocok dengan tabel perutean yang ditentukan dengan priorioty yang ditentukan. Fungsi ini mirip dengan aturan IP Command ruang pengguna yang disediakan oleh iProute2.
Pustaka data memberikan dukungan untuk mengikat memori sistem ke LUA.
data.new(size) data.new () membuat objek data baru yang mengalokasikan byte size .
d:getnumber(offset) D: getNumber () mengekstrak lua_integer dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setnumber(offset, number) D: setNumber () Masukkan number LUA_Integer ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getbyte(offset) D: getByte () mengekstrak byte dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setbyte(offset, byte) D: setByte () Masukkan byte ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getstring(offset[, length]) D: getString () mengekstrak string dengan byte length dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol. Jika length dihilangkan, ia mengekstrak semua byte dari offset ke akhir data .
d:setstring(offset, s) D: setString () Masukkan string s ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getint8(offset) D: GetInt8 (D, Offset) Mengekstrak integer 8-bit yang ditandatangani dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setint8(offset, number) D: setInt8 () memasukkan nomor 8-bit yang ditandatangani ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getuint8(offset) D: getuint8 () mengekstrak integer 8-bit yang tidak ditandatangani dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setuint8(offset, number) D: setuint8 () memasukkan nomor 8-bit yang tidak ditandatangani ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getint16(offset) D: getInt16 () mengekstrak integer 16-bit yang ditandatangani dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setint16(offset, number) D: setInt16 () memasukkan angka 16-bit yang ditandatangani ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getuint16(offset) D: getuint16 () mengekstrak bilangan bulat 16-bit yang tidak ditandatangani dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setuint16(offset, number) D: setuint16 () memasukkan angka 16-bit yang tidak ditandatangani ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getint32(offset) D: getInt32 () mengekstrak integer 32-bit yang ditandatangani dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setint32(offset, number) D: setInt32 () memasukkan nomor 32-bit yang ditandatangani ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getuint32(offset) D: getuint32 () mengekstrak bilangan bulat 32-bit yang tidak ditandatangani dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setuint32(offset, number) D: setuint32 () memasukkan angka 32-bit yang tidak ditandatangani ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:getint64(offset) D: getInt64 () mengekstrak integer 64-bit yang ditandatangani dari memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
d:setint64(offset, number) D: setInt64 () memasukkan nomor 64-bit yang ditandatangani ke dalam memori yang dirujuk oleh objek data dan byte offset , mulai dari nol.
Perpustakaan probe memberikan dukungan untuk probe kernel.
probe.new(symbol|address, handlers) probe.new () Mengembalikan objek probe baru untuk memantau symbol kernel (string) atau address (light userdata) dan menginstal handlers di sistem. handler harus didefinisikan sebagai tabel yang berisi bidang berikut:
pre : Fungsi untuk dipanggil sebelum instruksi yang diselidiki. Ini menerima symbol atau address , diikuti oleh penutupan yang dapat dipanggil untuk menunjukkan register CPU dan menumpuk di log sistem.post : Fungsi untuk dipanggil setelah instruksi yang diselidiki. Ini menerima symbol atau address , diikuti oleh penutupan yang dapat dipanggil untuk menunjukkan register CPU dan menumpuk di log sistem. p:stop() P: Stop () Menghapus penangan probe dari sistem.
p:enable(bool) P: Aktifkan () Mengaktifkan atau menonaktifkan penangan probe , sesuai dengan bool .
Perpustakaan syscall menyediakan dukungan untuk alamat dan angka panggilan sistem.
syscall.address(number) Syscall.address () Mengembalikan alamat panggilan sistem (Light UserData) yang dirujuk oleh number yang diberikan.
syscall.number(name) Syscall.number () Mengembalikan nomor panggilan sistem yang dirujuk oleh name yang diberikan.
Perpustakaan syscall.table menyediakan dukungan untuk menerjemahkan nama panggilan sistem ke alamat (Light UserData).
Perpustakaan xdp memberikan dukungan untuk subsistem Kernel Express Data Path (XDP). Perpustakaan ini terinspirasi oleh proyek GSOC Victor Nogueira.
xdp.attach(callback) xdp.attach () mendaftarkan fungsi callback ke runtime saat ini untuk dipanggil dari program XDP/EBPF setiap kali memanggil bpf_luaxdp_run kfunc. callback ini menerima argumen berikut:
buffer : Objek data yang mewakili buffer jaringan.argument : Objek data yang berisi argumen yang disahkan oleh program XDP/EBPF. Fungsi callback mungkin mengembalikan nilai yang ditentukan oleh tabel XDP.action.
xdp.detach() xdp.detach () tidak mendaftar callback yang terkait dengan runtime saat ini, jika ada.
xdp.actionXDP.Action adalah tabel yang mengekspor bendera XDP_ACTION ke LUA.
"ABORTED" : menunjukkan bahwa program XDP dibatalkan, biasanya karena kesalahan."DROP" : Menentukan bahwa paket harus dijatuhkan, membuangnya sepenuhnya."PASS" : Memungkinkan paket untuk melewati ke tumpukan jaringan Linux."TX" : Mentransmisikan paket kembali pada antarmuka yang sama yang diterima."REDIRECT" : Mengalihkan paket ke antarmuka lain atau konteks pemrosesan. Perpustakaan xtable menyediakan dukungan untuk mengembangkan ekstensi XTable NetFilter.
xtable.match(opts)xtable.match () Mengembalikan objek XTable baru untuk ekstensi kecocokan. Fungsi ini menerima argumen berikut:
opts : Tabel yang berisi bidang -bidang berikut:name : String Mewakili nama ekstensi XTable.revision : Integer mewakili revisi ekstensi XTable.family : Alamat Keluarga, salah satu NetFilter. Keluarga.proto : Nomor Protokol, salah satu dari Socket.ipproto.hooks : Hook untuk melampirkan ekstensi ke, satu nilai dari salah satu tabel Hooks - netfilter.inet_hooks, netfilter.bridge_hooks dan netfilter.arp_hooks (Catatan: netfilter.netdev_hooks tidak tersedia untuk warisan x_tables). (Misalnya - 1 << inet_hooks.LOCAL_OUT ).match : Fungsi untuk dipanggil untuk paket yang cocok. Itu menerima argumen berikut:skb (Readonly): Objek data yang mewakili buffer soket.par : Tabel yang berisi bidang hotdrop , thoff (transport header offset) dan fragoff (fragmen offset).userargs : String LUA yang ditularkan dari modul Userspace Xtable.true jika paket cocok dengan ekstensi; Kalau tidak, itu harus mengembalikan false .checkentry : Fungsi untuk dipanggil untuk memeriksa entri. Fungsi ini menerima userargs sebagai argumennya.destroy : Fungsi untuk dipanggil untuk menghancurkan ekstensi XTable. Fungsi ini menerima userargs sebagai argumennya. xtable.target(opts)xtable.target () Mengembalikan objek XTable baru untuk ekstensi target. Fungsi ini menerima argumen berikut:
opts : Tabel yang berisi bidang -bidang berikut:name : String Mewakili nama ekstensi XTable.revision : Integer mewakili revisi ekstensi XTable.family : Alamat Keluarga, salah satu NetFilter. Keluarga.proto : Nomor Protokol, salah satu dari Socket.ipproto.hooks : Hook untuk melampirkan ekstensi ke, satu nilai dari salah satu tabel Hooks - netfilter.inet_hooks, netfilter.bridge_hooks dan netfilter.arp_hooks (Catatan: netfilter.netdev_hooks tidak tersedia untuk warisan x_tables). (Misalnya - 1 << inet_hooks.LOCAL_OUT ).target : Fungsi harus dipanggil untuk paket penargetan. Itu menerima argumen berikut:skb : Objek data yang mewakili buffer soket.par (readonly): Tabel yang berisi bidang hotdrop , thoff (transport header offset) dan fragoff (fragmen offset).userargs : String LUA yang ditularkan dari modul Userspace Xtable.checkentry : Fungsi untuk dipanggil untuk memeriksa entri. Fungsi ini menerima userargs sebagai argumennya.destroy : Fungsi untuk dipanggil untuk menghancurkan ekstensi XTable. Fungsi ini menerima userargs sebagai argumennya. Perpustakaan netfilter memberikan dukungan untuk sistem pengait NetFilter baru.
netfilter.register(ops) NetFilter.Register () mendaftarkan kait netfilter baru dengan tabel ops yang diberikan. Fungsi ini menerima argumen berikut:
ops : Tabel yang berisi bidang -bidang berikut:pf : Keluarga Protokol, salah satu dari NetFilter. Keluargahooknum : Hook untuk memasang filter ke, satu nilai dari salah satu tabel Hooks - netfilter.inet_hooks, netfilter.bridge_hooks, netfilter.arp_hooks dan netfilter.netdev_hooks. (Misalnya - inet_hooks.LOCAL_OUT + 11 ).priority : Prioritas kait. Salah satu nilai dari tabel netfilter.ip_priority atau netfilter.bridge_priority.hook : Fungsi untuk dipanggil untuk kait. Itu menerima argumen berikut:skb : a data object representing the socket buffer.netfilter.familynetfilter.family is a table that exports address families to Lua.
"UNSPEC" : Unspecified."INET" : Internet Protocol version 4."IPV4" : Internet Protocol version 4."IPV6" : Internet Protocol version 6."ARP" : Address Resolution Protocol."NETDEV" : Device ingress and egress path"BRIDGE" : Ethernet Bridge. netfilter.actionnetfilter.action is a table that exports netfilter actions to Lua.
"DROP" : NF_DROP . The packet is dropped. It is not forwarded, processed, or seen by any other network layer."ACCEPT" : NF_ACCEPT . The packet is accepted and passed to the next step in the network processing chain."STOLEN" : NF_STOLEN . The packet is taken by the handler, and processing stops."QUEUE" : NF_QUEUE . The packet is queued for user-space processing."REPEAT" : NF_REPEAT . The packet is sent through the hook chain again."STOP" : NF_STOP . Processing of the packet stops."CONTINUE" : XT_CONTINUE . Return the packet should continue traversing the rules within the same table."RETURN" : XT_RETURN . Return the packet to the previous chain. netfilter.inet_hooksnetfilter.inet_hooks is a table that exports inet netfilter hooks to Lua.
"PRE_ROUTING" : NF_INET_PRE_ROUTING . The packet is received by the network stack."LOCAL_IN" : NF_INET_LOCAL_IN . The packet is destined for the local system."FORWARD" : NF_INET_FORWARD . The packet is to be forwarded to another host."LOCAL_OUT" : NF_INET_LOCAL_OUT . The packet is generated by the local system."POST_ROUTING" : NF_INET_POST_ROUTING . The packet is about to be sent out. netfilter.bridge_hooksnetfilter.bridge_hooks is a table that exports bridge netfilter hooks to Lua.
"PRE_ROUTING" : NF_BR_PRE_ROUTING . First hook invoked, runs before forward database is consulted."LOCAL_IN" : NF_BR_LOCAL_IN . Invoked for packets destined for the machine where the bridge was configured on."FORWARD" : NF_BR_FORWARD . Called for frames that are bridged to a different port of the same logical bridge device."LOCAL_OUT" : NF_BR_LOCAL_OUT . Called for locally originating packets that will be transmitted via the bridge."POST_ROUTING" : NF_BR_POST_ROUTING . Called for all locally generated packets and all bridged packets netfilter.arp_hooksnetfilter.arp_hooks is a table that exports arp netfilter hooks to Lua.
"IN" : NF_ARP_IN . The packet is received by the network stack."OUT" : NF_ARP_OUT . The packet is generated by the local system."FORWARD" : NF_ARP_FORWARD . The packet is to be forwarded to another host. netfilter.netdev_hooksnetfilter.netdev_hooks is a table that exports netdev netfilter hooks to Lua.
"INGRESS" : NF_NETDEV_INGRESS . The packet is received by the network stack."EGRESS" : NF_NETDEV_EGRESS . The packet is generated by the local system. netfilter.ip_prioritynetfilter.ip_priority is a table that exports netfilter IPv4/IPv6 priority levels to Lua.
"FIRST" : NF_IP_PRI_FIRST"RAW_BEFORE_DEFRAG" : NF_IP_PRI_RAW_BEFORE_DEFRAG"CONNTRACK_DEFRAG" : NF_IP_PRI_CONNTRACK_DEFRAG"RAW" : NF_IP_PRI_RAW"SELINUX_FIRST" : NF_IP_PRI_SELINUX_FIRST"CONNTRACK" : NF_IP_PRI_CONNTRACK"MANGLE" : NF_IP_PRI_MANGLE"NAT_DST" : NF_IP_PRI_NAT_DST"FILTER" : NF_IP_PRI_FILTER"SECURITY" : NF_IP_PRI_SECURITY"NAT_SRC" : NF_IP_PRI_NAT_SRC"SELINUX_LAST" : NF_IP_PRI_SELINUX_LAST"CONNTRACK_HELPER" : NF_IP_PRI_CONNTRACK_HELPER"LAST" : NF_IP_PRI_LAST netfilter.bridge_prioritynetfilter.bridge_priority is a table that exports netfilter bridge priority levels to Lua.
"FIRST" : NF_BR_PRI_FIRST"NAT_DST_BRIDGED" : NF_BR_PRI_NAT_DST_BRIDGED"FILTER_BRIDGED" : NF_BR_PRI_FILTER_BRIDGED"BRNF" : NF_BR_PRI_BRNF"NAT_DST_OTHER" : NF_BR_PRI_NAT_DST_OTHER"FILTER_OTHER" : NF_BR_PRI_FILTER_OTHER"NAT_SRC" : NF_BR_PRI_NAT_SRC"LAST" : NF_BR_PRI_LAST The luaxt userspace library provides support for generating userspace code for xtable extensions.
To build the library, the following steps are required:
usr/lib/xtable and create a libxt_<ext_name>.lua file.luaxt ) in the created file.LUAXTABLE_MODULE=<ext_name> make to build the extension and LUAXTABLE_MODULE=<ext_name> make install (as root) to install the userspace plugin to the system. Now load the extension normally using iptables .
luaxt.match(opts)luaxt.match() returns a new luaxt object for match extensions. This function receives the following arguments:
opts : a table containing the following fields:revision : integer representing the xtable extension revision ( must be same as used in corresponding kernel extension).family : address family, one of luaxt.familyhelp : function to be called for displaying help message for the extension.init : function to be called for initializing the extension. This function receives an par table that can be used to set userargs . ( par.userargs = "mydata" )print : function to be called for printing the arguments. This function recevies userargs set by the init or parse function.save : function to be called for saving the arguments. This function recevies userargs set by the init or parse function.parse : function to be called for parsing the command line arguments. This function receives an par table that can be used to set userargs and flags . ( par.userargs = "mydata" )final_check : function to be called for final checking of the arguments. This function receives flags set by the parse function. luaxt.target(opts)luaxt.target() returns a new luaxt object for target extensions. This function receives the following arguments:
opts : a table containing the following fields:revision : integer representing the xtable extension revision ( must be same as used in corresponding kernel extension).family : address family, one of luaxt.familyhelp : function to be called for displaying help message for the extension.init : function to be called for initializing the extension. This function receives an par table that can be used to set userargs . ( par.userargs = "mydata" )print : function to be called for printing the arguments. This function recevies userargs set by the init or parse function.save : function to be called for saving the arguments. This function recevies userargs set by the init or parse function.parse : function to be called for parsing the command line arguments. This function receives an par table that can be used to set userargs and flags . ( par.userargs = "mydata" )final_check : function to be called for final checking of the arguments. This function receives flags set by the parse function. luaxt.familyluaxt.family is a table that exports address families to Lua.
"UNSPEC" : Unspecified."INET" : Internet Protocol version 4."IPV4" : Internet Protocol version 4."IPV6" : Internet Protocol version 6."ARP" : Address Resolution Protocol."NETDEV" : Device ingress and egress path"BRIDGE" : Ethernet Bridge.completion The completion library provides support for the kernel completion primitives.
Task completion is a synchronization mechanism used to coordinate the execution of multiple threads, similar to pthread_barrier , it allows threads to wait for a specific event to occur before proceeding, ensuring certain tasks are complete in a race-free manner.
completion.new() completion.new() creates a new completion object.
c:complete()c:complete() signals a single thread waiting on this completion.
c:wait([timeout]) c:wait() waits for completion of a task until the specified timeout expires. The timeout is specified in milliseconds. If the timeout parameter is omitted, it waits indefinitely. Passing a timeout value less than zero results in undefined behavior. Threads waiting for events can be interrupted by signals, for example, such as when thread.stop is invoked. Therefore, this function can return in three ways:
truenil, "timeout"nil, "interrupt" spyglass is a kernel script that implements a keylogger inspired by the spy kernel module. This kernel script logs the keysym of the pressed keys in a device ( /dev/spyglass ). If the keysym is a printable character, spyglass logs the keysym itself; otherwise, it logs a mnemonic of the ASCII code, (eg, <del> stands for 127 ).
sudo make examples_install # installs examples
sudo lunatik run examples/spyglass # runs spyglass
sudo tail -f /dev/spyglass # prints the key log
sudo sh -c "echo 'enable=false' > /dev/spyglass" # disable the key logging
sudo sh -c "echo 'enable=true' > /dev/spyglass" # enable the key logging
sudo sh -c "echo 'net=127.0.0.1:1337' > /dev/spyglass" # enable network support
nc -lu 127.0.0.1 1337 & # listen to UDP 127.0.0.1:1337
sudo tail -f /dev/spyglass # sends the key log through the network
keylocker is a kernel script that implements Konami Code for locking and unlocking the console keyboard. When the user types ↑ ↑ ↓ ↓ ← → ← → LCTRL LALT , the keyboard will be locked ; that is, the system will stop processing any key pressed until the user types the same key sequence again.
sudo make examples_install # installs examples
sudo lunatik run examples/keylocker # runs keylocker
<↑> <↑> <↓> <↓> <←> <→> <←> <→> <LCTRL> <LALT> # locks keyboard
<↑> <↑> <↓> <↓> <←> <→> <←> <→> <LCTRL> <LALT> # unlocks keyboard
tap is a kernel script that implements a sniffer using AF_PACKET socket. It prints destination and source MAC addresses followed by Ethernet type and the frame size.
sudo make examples_install # installs examples
sudo lunatik run examples/tap # runs tap
cat /dev/tap
shared is a kernel script that implements an in-memory key-value store using rcu, data, socket and thread.
sudo make examples_install # installs examples
sudo lunatik spawn examples/shared # spawns shared
nc 127.0.0.1 90 # connects to shared
foo=bar # assigns "bar" to foo
foo # retrieves foo
bar
^C # finishes the connection
echod is an echo server implemented as kernel scripts.
sudo make examples_install # installs examples
sudo lunatik spawn examples/echod/daemon # runs echod
nc 127.0.0.1 1337
hello kernel!
hello kernel!
systrack is a kernel script that implements a device driver to monitor system calls. It prints the amount of times each system call was called since the driver has been installed.
sudo make examples_install # installs examples
sudo lunatik run examples/systrack # runs systracker
cat /dev/systrack
writev: 0
close: 1927
write: 1085
openat: 2036
read: 4131
readv: 0
filter is a kernel extension composed by a XDP/eBPF program to filter HTTPS sessions and a Lua kernel script to filter SNI TLS extension. This kernel extension drops any HTTPS request destinated to a blacklisted server.
Compile and install libbpf , libxdp and xdp-loader :
mkdir -p " ${LUNATIK_DIR} " ; cd " ${LUNATIK_DIR} " # LUNATIK_DIR must be set to the same value as above (Setup section)
git clone --depth 1 --recurse-submodules https://github.com/xdp-project/xdp-tools.git
cd xdp-tools/lib/libbpf/src
make
sudo DESTDIR=/ make install
cd ../../../
make libxdp
cd xdp-loader
make
sudo make installCome back to this repository, install and load the filter:
cd ${LUNATIK_DIR} /lunatik # cf. above
sudo make btf_install # needed to export the 'bpf_luaxdp_run' kfunc
sudo make examples_install # installs examples
make ebpf # builds the XDP/eBPF program
sudo make ebpf_install # installs the XDP/eBPF program
sudo lunatik run examples/filter/sni false # runs the Lua kernel script
sudo xdp-loader load -m skb < ifname > https.o # loads the XDP/eBPF programFor example, testing is easy thanks to docker. Assuming docker is installed and running:
sudo xdp-loader load -m skb docker0 https.o
sudo journalctl -ft kerneldocker run --rm -it alpine/curl https://ebpf.io The system logs (in the first terminal) should display filter_sni: ebpf.io DROP , and the docker run… should return curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to ebpf.io:443 .
This other sni filter uses netfilter api.
dnsblock is a kernel script that uses the lunatik xtable library to filter DNS packets. This script drops any outbound DNS packet with question matching the blacklist provided by the user.
sudo make examples_install # installs examples
cd examples/dnsblock
make # builds the userspace extension for netfilter
sudo make install # installs the extension to Xtables directory
sudo lunatik run examples/dnsblock/dnsblock false # runs the Lua kernel script
sudo iptables -A OUTPUT -m dnsblock -j DROP # this initiates the netfilter framework to load our extension
sudo make examples_install # installs examples
sudo lunatik run examples/dnsblock/nf_dnsblock false # runs the Lua kernel script
dnsdoctor is a kernel script that uses the lunatik xtable library to change the DNS response from Public IP to a Private IP if the destination IP matches the one provided by the user. For example, if the user wants to change the DNS response from 192.168.10.1 to 10.1.2.3 for the domain lunatik.com if the query is being sent to 10.1.1.2 (a private client), this script can be used.
sudo make examples_install # installs examples
cd examples/dnsdoctor
setup.sh # sets up the environment
# test the setup, a response with IP 192.168.10.1 should be returned
dig lunatik.com
# run the Lua kernel script
sudo lunatik run examples/dnsdoctor/dnsdoctor false
# build and install the userspace extension for netfilter
make
sudo make install
# add rule to the mangle table
sudo iptables -t mangle -A PREROUTING -p udp --sport 53 -j dnsdoctor
# test the setup, a response with IP 10.1.2.3 should be returned
dig lunatik.com
# cleanup
sudo iptables -t mangle -D PREROUTING -p udp --sport 53 -j dnsdoctor # remove the rule
sudo lunatik unload
cleanup.sh
sudo make examples_install # installs examples
examples/dnsdoctor/setup.sh # sets up the environment
# test the setup, a response with IP 192.168.10.1 should be returned
dig lunatik.com
# run the Lua kernel script
sudo lunatik run examples/dnsdoctor/nf_dnsdoctor false
# test the setup, a response with IP 10.1.2.3 should be returned
dig lunatik.com
# cleanup
sudo lunatik unload
examples/dnsdoctor/cleanup.sh
Lunatik is dual-licensed under MIT or GPL-2.0-only.
Lua submodule is licensed under MIT. For more details, see its Copyright Notice.
Klibc submodule is dual-licensed under BSD 3-Clause or GPL-2.0-only. For more details, see its LICENCE file.