Subpackages
-
patroni.dcs package
-
Submodules
- patroni.dcs.consul module
- patroni.dcs.etcd module
-
patroni.dcs.etcd3 module
-
AuthFailed
-
AuthNotEnabled
-
AuthOldRevision
-
DeadlineExceeded
-
Etcd3
-
Etcd3Client
-
Etcd3ClientError
-
Etcd3Error
-
Etcd3Exception
-
FailedPrecondition
-
GRPCCode
-
InvalidArgument
-
InvalidAuthToken
-
KVCache
-
LeaseNotFound
-
NotFound
-
PatroniEtcd3Client
-
PermissionDenied
-
Unavailable
-
Unknown
-
UnsupportedEtcdVersion
-
UserEmpty
-
_handle_auth_errors()
-
_raise_for_data()
-
base64_decode()
-
base64_encode()
-
build_range_request()
-
prefix_range_end()
-
to_bytes()
-
- patroni.dcs.exhibitor module
- patroni.dcs.kubernetes module
- patroni.dcs.raft module
- patroni.dcs.zookeeper module
-
Module contents
-
AbstractDCS
-
AbstractDCS._CONFIG
-
AbstractDCS._FAILOVER
-
AbstractDCS._FAILSAFE
-
AbstractDCS._HISTORY
-
AbstractDCS._INITIALIZE
-
AbstractDCS._LEADER
-
AbstractDCS._LEADER_OPTIME
-
AbstractDCS._MEMBERS
-
AbstractDCS._OPTIME
-
AbstractDCS._STATUS
-
AbstractDCS._SYNC
-
AbstractDCS.__get_postgresql_cluster()
-
AbstractDCS.__init__()
-
AbstractDCS._abc_impl
-
AbstractDCS._delete_leader()
-
AbstractDCS._get_mpp_cluster()
-
AbstractDCS._load_cluster()
-
AbstractDCS._mpp_cluster_loader()
-
AbstractDCS._postgresql_cluster_loader()
-
AbstractDCS._set_loop_wait()
-
AbstractDCS._update_leader()
-
AbstractDCS._write_failsafe()
-
AbstractDCS._write_leader_optime()
-
AbstractDCS._write_status()
-
AbstractDCS.attempt_to_acquire_leader()
-
AbstractDCS.cancel_initialization()
-
AbstractDCS.client_path()
-
AbstractDCS.cluster
-
AbstractDCS.config_path
-
AbstractDCS.delete_cluster()
-
AbstractDCS.delete_leader()
-
AbstractDCS.delete_sync_state()
-
AbstractDCS.failover_path
-
AbstractDCS.failsafe
-
AbstractDCS.failsafe_path
-
AbstractDCS.get_cluster()
-
AbstractDCS.get_mpp_coordinator()
-
AbstractDCS.history_path
-
AbstractDCS.initialize()
-
AbstractDCS.initialize_path
-
AbstractDCS.is_mpp_coordinator()
-
AbstractDCS.last_seen
-
AbstractDCS.leader_optime_path
-
AbstractDCS.leader_path
-
AbstractDCS.loop_wait
-
AbstractDCS.manual_failover()
-
AbstractDCS.member_path
-
AbstractDCS.members_path
-
AbstractDCS.mpp
-
AbstractDCS.reload_config()
-
AbstractDCS.reset_cluster()
-
AbstractDCS.set_config_value()
-
AbstractDCS.set_failover_value()
-
AbstractDCS.set_history_value()
-
AbstractDCS.set_retry_timeout()
-
AbstractDCS.set_sync_state_value()
-
AbstractDCS.set_ttl()
-
AbstractDCS.status_path
-
AbstractDCS.sync_path
-
AbstractDCS.sync_state()
-
AbstractDCS.take_leader()
-
AbstractDCS.touch_member()
-
AbstractDCS.ttl
-
AbstractDCS.update_leader()
-
AbstractDCS.watch()
-
AbstractDCS.write_failsafe()
-
AbstractDCS.write_leader_optime()
-
AbstractDCS.write_status()
-
AbstractDCS.write_sync_state()
-
-
Cluster
-
Cluster.__permanent_logical_slots
-
Cluster.__permanent_physical_slots
-
Cluster.__permanent_slots
-
Cluster._get_members_slots()
-
Cluster._get_permanent_slots()
-
Cluster._has_permanent_logical_slots()
-
Cluster._merge_permanent_slots()
-
Cluster.empty()
-
Cluster.filter_permanent_slots()
-
Cluster.get_clone_member()
-
Cluster.get_member()
-
Cluster.get_replication_slots()
-
Cluster.get_slot_name_on_primary()
-
Cluster.has_member()
-
Cluster.has_permanent_slots()
-
Cluster.is_empty()
-
Cluster.is_logical_slot()
-
Cluster.is_physical_slot()
-
Cluster.is_unlocked()
-
Cluster.leader_name
-
Cluster.min_version
-
Cluster.should_enforce_hot_standby_feedback()
-
Cluster.slots
-
Cluster.timeline
-
-
ClusterConfig
-
Failover
-
Leader
-
Member
-
RemoteMember
-
ReturnFalseException
-
Status
-
SyncState
-
SyncState._asdict()
-
SyncState._field_defaults
-
SyncState._fields
-
SyncState._make()
-
SyncState._replace()
-
SyncState._str_to_list()
-
SyncState.empty()
-
SyncState.from_node()
-
SyncState.is_empty
-
SyncState.leader
-
SyncState.leader_matches()
-
SyncState.matches()
-
SyncState.members
-
SyncState.sync_standby
-
SyncState.version
-
-
TimelineHistory
-
catch_return_false_exception()
-
dcs_modules()
-
get_dcs()
-
iter_dcs_classes()
-
parse_connection_string()
-
slot_name_from_member_name()
-
-
Submodules
-
patroni.postgresql package
- Subpackages
-
Submodules
- patroni.postgresql.bootstrap module
- patroni.postgresql.callback_executor module
- patroni.postgresql.cancellable module
- patroni.postgresql.config module
- patroni.postgresql.connection module
- patroni.postgresql.misc module
- patroni.postgresql.postmaster module
- patroni.postgresql.rewind module
- patroni.postgresql.slots module
- patroni.postgresql.sync module
-
patroni.postgresql.validator module
-
Bool
-
Enum
-
EnumBool
-
Integer
-
InvalidGucValidatorsFile
-
Number
-
Real
-
String
-
ValidatorFactory
-
ValidatorFactoryInvalidSpec
-
ValidatorFactoryInvalidType
-
ValidatorFactoryNoType
-
_Transformable
-
_get_postgres_guc_validators()
-
_load_postgres_gucs_validators()
-
_read_postgres_gucs_validators_file()
-
_transform_parameter_value()
-
transform_postgresql_parameter_value()
-
transform_recovery_parameter_value()
-
-
Module contents
-
Postgresql
-
Postgresql.POSTMASTER_START_TIME
-
Postgresql.TL_LSN
-
Postgresql.__init__()
-
Postgresql._before_stop()
-
Postgresql._checkpoint_locations_from_controldata()
-
Postgresql._cluster_info_state_get()
-
Postgresql._do_before_stop()
-
Postgresql._do_stop()
-
Postgresql._get_gucs()
-
Postgresql._pre_promote()
-
Postgresql._query()
-
Postgresql._version_file_exists()
-
Postgresql._wait_for_connection_close()
-
Postgresql._wait_promote()
-
Postgresql._wal_position()
-
Postgresql.available_gucs
-
Postgresql.call_nowait()
-
Postgresql.callback
-
Postgresql.can_advance_slots
-
Postgresql.can_create_replica_without_replication_connection()
-
Postgresql.cb_called
-
Postgresql.check_for_startup()
-
Postgresql.check_startup_state_changed()
-
Postgresql.checkpoint()
-
Postgresql.cluster_info_query
-
Postgresql.configure_server_parameters()
-
Postgresql.connection()
-
Postgresql.controldata()
-
Postgresql.create_replica_methods
-
Postgresql.data_dir
-
Postgresql.data_directory_empty()
-
Postgresql.database
-
Postgresql.enforce_hot_standby_feedback
-
Postgresql.ensure_major_version_is_known()
-
Postgresql.follow()
-
Postgresql.get_guc_value()
-
Postgresql.get_history()
-
Postgresql.get_major_version()
-
Postgresql.get_postgres_role_from_data_directory()
-
Postgresql.get_primary_timeline()
-
Postgresql.get_replica_timeline()
-
Postgresql.get_replication_connection_cursor()
-
Postgresql.handle_parameter_change()
-
Postgresql.initdb()
-
Postgresql.is_healthy()
-
Postgresql.is_primary()
-
Postgresql.is_running()
-
Postgresql.is_starting()
-
Postgresql.last_operation()
-
Postgresql.latest_checkpoint_location()
-
Postgresql.lsn_name
-
Postgresql.major_version
-
Postgresql.move_data_directory()
-
Postgresql.parse_wal_record()
-
Postgresql.pending_restart_reason
-
Postgresql.pg_control_exists()
-
Postgresql.pg_control_timeline()
-
Postgresql.pg_ctl()
-
Postgresql.pg_isready()
-
Postgresql.pg_stat_replication()
-
Postgresql.pg_tblspc_realpaths()
-
Postgresql.pg_wal_realpath()
-
Postgresql.pgcommand()
-
Postgresql.postmaster_start_time()
-
Postgresql.primary_conninfo()
-
Postgresql.primary_slot_name()
-
Postgresql.promote()
-
Postgresql.query()
-
Postgresql.received_location()
-
Postgresql.received_timeline()
-
Postgresql.reload()
-
Postgresql.reload_config()
-
Postgresql.remove_data_directory()
-
Postgresql.replay_paused()
-
Postgresql.replayed_location()
-
Postgresql.replica_cached_timeline()
-
Postgresql.replica_method_can_work_without_replication_connection()
-
Postgresql.replica_method_options()
-
Postgresql.replication_state()
-
Postgresql.replication_state_from_parameters()
-
Postgresql.reset_cluster_info_state()
-
Postgresql.restart()
-
Postgresql.resume_wal_replay()
-
Postgresql.role
-
Postgresql.schedule_sanity_checks_after_pause()
-
Postgresql.server_version
-
Postgresql.set_enforce_hot_standby_feedback()
-
Postgresql.set_pending_restart_reason()
-
Postgresql.set_role()
-
Postgresql.set_state()
-
Postgresql.slots()
-
Postgresql.start()
-
Postgresql.state
-
Postgresql.stop()
-
Postgresql.supports_multiple_sync
-
Postgresql.synchronous_commit()
-
Postgresql.synchronous_standby_names()
-
Postgresql.sysid
-
Postgresql.terminate_postmaster()
-
Postgresql.terminate_starting_postmaster()
-
Postgresql.time_in_state()
-
Postgresql.timeline_wal_position()
-
Postgresql.wait_for_port_open()
-
Postgresql.wait_for_startup()
-
Postgresql.wal_dir
-
Postgresql.wal_flush
-
Postgresql.wal_name
-
Postgresql.waldump()
-
-
null_context()
-
- patroni.scripts package
- patroni.watchdog package
Submodules
-
patroni.api module
-
RestApiHandler
-
RestApiHandler.__init__()
-
RestApiHandler._read_json_content()
-
RestApiHandler._write_json_response()
-
RestApiHandler._write_status_code_only()
-
RestApiHandler._write_status_response()
-
RestApiHandler.do_DELETE_restart()
-
RestApiHandler.do_DELETE_switchover()
-
RestApiHandler.do_GET()
-
RestApiHandler.do_GET_cluster()
-
RestApiHandler.do_GET_config()
-
RestApiHandler.do_GET_failsafe()
-
RestApiHandler.do_GET_history()
-
RestApiHandler.do_GET_liveness()
-
RestApiHandler.do_GET_metrics()
-
RestApiHandler.do_GET_patroni()
-
RestApiHandler.do_GET_readiness()
-
RestApiHandler.do_HEAD()
-
RestApiHandler.do_OPTIONS()
-
RestApiHandler.do_PATCH_config()
-
RestApiHandler.do_POST_citus()
-
RestApiHandler.do_POST_failover()
-
RestApiHandler.do_POST_failsafe()
-
RestApiHandler.do_POST_mpp()
-
RestApiHandler.do_POST_reinitialize()
-
RestApiHandler.do_POST_reload()
-
RestApiHandler.do_POST_restart()
-
RestApiHandler.do_POST_sigterm()
-
RestApiHandler.do_POST_switchover()
-
RestApiHandler.do_PUT_config()
-
RestApiHandler.get_postgresql_status()
-
RestApiHandler.handle_one_request()
-
RestApiHandler.is_failover_possible()
-
RestApiHandler.log_message()
-
RestApiHandler.parse_request()
-
RestApiHandler.parse_schedule()
-
RestApiHandler.poll_failover_result()
-
RestApiHandler.query()
-
RestApiHandler.write_response()
-
-
RestApiServer
-
RestApiServer.__has_dual_stack()
-
RestApiServer.__httpserver_init()
-
RestApiServer.__init__()
-
RestApiServer.__initialize()
-
RestApiServer.__members_ips()
-
RestApiServer.__resolve_ips()
-
RestApiServer._build_allowlist()
-
RestApiServer._set_fd_cloexec()
-
RestApiServer.check_access()
-
RestApiServer.check_auth_header()
-
RestApiServer.check_basic_auth_key()
-
RestApiServer.daemon_threads
-
RestApiServer.get_certificate_serial_number()
-
RestApiServer.handle_error()
-
RestApiServer.process_request_thread()
-
RestApiServer.query()
-
RestApiServer.reload_config()
-
RestApiServer.reload_local_certificate()
-
RestApiServer.shutdown_request()
-
-
check_access()
-
- patroni.async_executor module
- patroni.collections module
-
patroni.config module
-
Config
-
Config.PATRONI_CONFIG_VARIABLE
-
Config.__CACHE_FILENAME
-
Config.__DEFAULT_CONFIG
-
Config.__get_and_maybe_adjust_int_value()
-
Config.__init__()
-
Config._build_effective_configuration()
-
Config._build_environment_configuration()
-
Config._load_cache()
-
Config._load_config_file()
-
Config._load_config_path()
-
Config._process_postgresql_parameters()
-
Config._safe_copy_dynamic_configuration()
-
Config._validate_and_adjust_timeouts()
-
Config._validate_failover_tags()
-
Config.config_file
-
Config.copy()
-
Config.dynamic_configuration
-
Config.get()
-
Config.get_default_config()
-
Config.local_configuration
-
Config.reload_local_configuration()
-
Config.save_cache()
-
Config.set_dynamic_configuration()
-
-
default_validator()
-
-
patroni.config_generator module
-
AbstractConfigGenerator
-
AbstractConfigGenerator.__init__()
-
AbstractConfigGenerator._abc_impl
-
AbstractConfigGenerator._format_block()
-
AbstractConfigGenerator._format_config()
-
AbstractConfigGenerator._format_config_section()
-
AbstractConfigGenerator._write_config_to_fd()
-
AbstractConfigGenerator.generate()
-
AbstractConfigGenerator.get_template_config()
-
AbstractConfigGenerator.write_config()
-
-
RunningClusterConfigGenerator
-
RunningClusterConfigGenerator.__init__()
-
RunningClusterConfigGenerator._abc_impl
-
RunningClusterConfigGenerator._enrich_config_from_running_instance()
-
RunningClusterConfigGenerator._get_bin_dir_from_running_instance()
-
RunningClusterConfigGenerator._get_connection_cursor()
-
RunningClusterConfigGenerator._get_hba_conn_types
-
RunningClusterConfigGenerator._required_pg_params
-
RunningClusterConfigGenerator._set_conf_files()
-
RunningClusterConfigGenerator._set_pg_params()
-
RunningClusterConfigGenerator._set_su_params()
-
RunningClusterConfigGenerator.generate()
-
-
SampleConfigGenerator
-
generate_config()
-
get_address()
-
-
patroni.ctl module
-
PatroniCtlException
-
PatronictlPrettyTable
-
_do_failover_or_switchover()
-
_get_configuration()
-
apply_config_changes()
-
apply_yaml_file()
-
check_response()
-
confirm_members_action()
-
format_config_for_editing()
-
format_pg_version()
-
generate_topology()
-
get_all_members()
-
get_all_members_leader_first()
-
get_any_member()
-
get_cluster_service_info()
-
get_cursor()
-
get_dcs()
-
get_members()
-
invoke_editor()
-
is_citus_cluster()
-
load_config()
-
output_members()
-
parse_dcs()
-
parse_scheduled()
-
print_output()
-
query_member()
-
request_patroni()
-
show_diff()
-
temporary_file()
-
timestamp()
-
toggle_pause()
-
topology_sort()
-
wait_until_pause_is_applied()
-
watching()
-
-
patroni.daemon module
-
AbstractPatroniDaemon
-
AbstractPatroniDaemon.__init__()
-
AbstractPatroniDaemon._abc_impl
-
AbstractPatroniDaemon._run_cycle()
-
AbstractPatroniDaemon._shutdown()
-
AbstractPatroniDaemon.api_sigterm()
-
AbstractPatroniDaemon.received_sigterm
-
AbstractPatroniDaemon.reload_config()
-
AbstractPatroniDaemon.run()
-
AbstractPatroniDaemon.setup_signal_handlers()
-
AbstractPatroniDaemon.shutdown()
-
AbstractPatroniDaemon.sighup_handler()
-
AbstractPatroniDaemon.sigterm_handler()
-
-
abstract_main()
-
get_base_arg_parser()
-
- patroni.dynamic_loader module
- patroni.exceptions module
-
patroni.file_perm module
-
__FilePermissions
-
__FilePermissions._FilePermissions__PG_DIR_MODE_GROUP
-
__FilePermissions._FilePermissions__PG_DIR_MODE_OWNER
-
__FilePermissions._FilePermissions__PG_FILE_MODE_GROUP
-
__FilePermissions._FilePermissions__PG_FILE_MODE_OWNER
-
__FilePermissions._FilePermissions__PG_MODE_MASK_GROUP
-
__FilePermissions._FilePermissions__PG_MODE_MASK_OWNER
-
__FilePermissions._FilePermissions__set_group_permissions()
-
__FilePermissions._FilePermissions__set_owner_permissions()
-
__FilePermissions._FilePermissions__set_umask()
-
__FilePermissions.__init__()
-
__FilePermissions.dir_create_mode
-
__FilePermissions.file_create_mode
-
__FilePermissions.set_permissions_from_data_directory()
-
-
- patroni.global_config module
-
patroni.ha module
-
Failsafe
-
Ha
-
Ha.__init__()
-
Ha._delete_leader()
-
Ha._do_reinitialize()
-
Ha._failsafe_config()
-
Ha._get_failover_action_name()
-
Ha._get_node_to_follow()
-
Ha._handle_crash_recovery()
-
Ha._handle_dcs_error()
-
Ha._handle_rewind_or_reinitialize()
-
Ha._is_healthiest_node()
-
Ha._run_cycle()
-
Ha._sync_replication_slots()
-
Ha.acquire_lock()
-
Ha.bootstrap()
-
Ha.bootstrap_standby_leader()
-
Ha.call_failsafe_member()
-
Ha.cancel_initialization()
-
Ha.check_failsafe_topology()
-
Ha.check_timeline()
-
Ha.clone()
-
Ha.delete_future_restart()
-
Ha.demote()
-
Ha.enforce_follow_remote_member()
-
Ha.enforce_primary_role()
-
Ha.evaluate_scheduled_restart()
-
Ha.failsafe_is_active()
-
Ha.fetch_node_status()
-
Ha.fetch_nodes_statuses()
-
Ha.follow()
-
Ha.future_restart_scheduled()
-
Ha.get_effective_tags()
-
Ha.get_failover_candidates()
-
Ha.get_remote_member()
-
Ha.handle_long_action_in_progress()
-
Ha.handle_starting_instance()
-
Ha.has_lock()
-
Ha.is_failover_possible()
-
Ha.is_failsafe_mode()
-
Ha.is_healthiest_node()
-
Ha.is_lagging()
-
Ha.is_leader()
-
Ha.is_paused()
-
Ha.is_standby_cluster()
-
Ha.is_sync_standby()
-
Ha.is_synchronous_mode()
-
Ha.load_cluster_from_dcs()
-
Ha.manual_failover_process_no_leader()
-
Ha.notify_mpp_coordinator()
-
Ha.post_bootstrap()
-
Ha.post_recover()
-
Ha.primary_stop_timeout()
-
Ha.process_healthy_cluster()
-
Ha.process_manual_failover_from_leader()
-
Ha.process_sync_replication()
-
Ha.process_unhealthy_cluster()
-
Ha.recover()
-
Ha.reinitialize()
-
Ha.release_leader_key_voluntarily()
-
Ha.restart()
-
Ha.restart_matches()
-
Ha.restart_scheduled()
-
Ha.run_cycle()
-
Ha.schedule_future_restart()
-
Ha.set_is_leader()
-
Ha.set_start_timeout()
-
Ha.should_run_scheduled_action()
-
Ha.shutdown()
-
Ha.sync_mode_is_active()
-
Ha.sysid_valid()
-
Ha.touch_member()
-
Ha.update_cluster_history()
-
Ha.update_failsafe()
-
Ha.update_lock()
-
Ha.wakeup()
-
Ha.watch()
-
Ha.while_not_sync_standby()
-
-
_FailsafeResponse
-
_MemberStatus
-
-
patroni.log module
-
PatroniLogger
-
PatroniLogger.DEFAULT_FORMAT
-
PatroniLogger.DEFAULT_LEVEL
-
PatroniLogger.DEFAULT_MAX_QUEUE_SIZE
-
PatroniLogger.DEFAULT_TRACEBACK_LEVEL
-
PatroniLogger.DEFAULT_TYPE
-
PatroniLogger.LOGGING_BROKEN_EXIT_CODE
-
PatroniLogger.NORMAL_LOG_QUEUE_SIZE
-
PatroniLogger.__init__()
-
PatroniLogger._close_old_handlers()
-
PatroniLogger._get_formatter()
-
PatroniLogger._get_json_formatter()
-
PatroniLogger._get_plain_formatter()
-
PatroniLogger._is_config_changed()
-
PatroniLogger.queue_size
-
PatroniLogger.records_lost
-
PatroniLogger.reload_config()
-
PatroniLogger.run()
-
PatroniLogger.shutdown()
-
PatroniLogger.update_loggers()
-
-
ProxyHandler
-
QueueHandler
-
_type()
-
debug_exception()
-
error_exception()
-
- patroni.psycopg module
- patroni.raft_controller module
- patroni.request module
- patroni.tags module
-
patroni.utils module
-
Retry
-
RetryFailedError
-
_sleep()
-
apply_keepalive_limit()
-
cluster_as_json()
-
compare_values()
-
convert_int_from_base_unit()
-
convert_real_from_base_unit()
-
convert_to_base_unit()
-
data_directory_is_empty()
-
deep_compare()
-
enable_keepalive()
-
get_conversion_table()
-
get_major_version()
-
get_postgres_version()
-
is_subpath()
-
iter_response_objects()
-
keepalive_intvl()
-
keepalive_socket_options()
-
maybe_convert_from_base_unit()
-
parse_bool()
-
parse_int()
-
parse_real()
-
patch_config()
-
polling_loop()
-
read_stripped()
-
split_host_port()
-
strtod()
-
strtol()
-
unquote()
-
uri()
-
validate_directory()
-
-
patroni.validator module
-
AtMostOne
-
BinDirectory
-
Case
-
Directory
-
EnumValidator
-
IntValidator
-
Optional
-
Or
-
Result
-
Schema
-
_get_type_name()
-
assert_()
-
comma_separated_host_port()
-
data_directory_empty()
-
get_bin_name()
-
is_ipv4_address()
-
is_ipv6_address()
-
validate_binary_name()
-
validate_connect_address()
-
validate_data_dir()
-
validate_host_port()
-
validate_host_port_list()
-
validate_host_port_listen()
-
validate_host_port_listen_multiple_hosts()
-
validate_log_field()
-
validate_log_format()
-
validate_watchdog_mode()
-
- patroni.version module
Module contents
Define general variables and functions for
patroni
.
- var PATRONI_ENV_PREFIX :
-
prefix for Patroni related configuration environment variables.
- var KUBERNETES_ENV_PREFIX :
-
prefix for Kubernetes related configuration environment variables.
- var MIN_PSYCOPG2 :
-
minimum version of
psycopg2
required by Patroni to work. - var MIN_PSYCOPG3 :
-
minimum version of
psycopg
required by Patroni to work.
- patroni. parse_version ( version : str ) Tuple [ int , ... ] View on GitHub
-
Convert version from human-readable format to tuple of integers.
Note
Designed for easy comparison of software versions in Python.
- Parameters :
-
version – human-readable software version, e.g.
2.5.4.dev1 (dt dec pq3 ext lo64)
. - Returns :
-
tuple of version parts, each part as an integer.
- Example :
-
>>> parse_version('2.5.4.dev1 (dt dec pq3 ext lo64)') (2, 5, 4)