ppf: add --reset flag to clear all state
This commit is contained in:
71
ppf.py
71
ppf.py
@@ -14,6 +14,7 @@ import sys
|
|||||||
from soup_parser import set_nobs
|
from soup_parser import set_nobs
|
||||||
import threading
|
import threading
|
||||||
import random
|
import random
|
||||||
|
import os
|
||||||
|
|
||||||
# Global profiler for signal handler access
|
# Global profiler for signal handler access
|
||||||
_profiler = None
|
_profiler = None
|
||||||
@@ -32,6 +33,68 @@ signal.signal(signal.SIGTERM, sigterm_handler)
|
|||||||
config = Config()
|
config = Config()
|
||||||
|
|
||||||
|
|
||||||
|
def reset_state():
|
||||||
|
"""Clear all proxy and session state for a fresh start.
|
||||||
|
|
||||||
|
Clears:
|
||||||
|
- proxylist table (all proxies)
|
||||||
|
- session_state table (test counters)
|
||||||
|
- stats_history table (historical stats)
|
||||||
|
- scraper_state.json (engine backoffs)
|
||||||
|
- mitm_certs.json (MITM cert tracking)
|
||||||
|
"""
|
||||||
|
db_path = config.watchd.database
|
||||||
|
data_dir = os.path.dirname(db_path) or 'data'
|
||||||
|
|
||||||
|
# Clear database tables
|
||||||
|
try:
|
||||||
|
db = mysqlite.mysqlite(db_path, str)
|
||||||
|
dbs.create_table_if_not_exists(db, 'proxylist')
|
||||||
|
|
||||||
|
db.execute('DELETE FROM proxylist')
|
||||||
|
db.commit()
|
||||||
|
_log('cleared proxylist table', 'reset')
|
||||||
|
|
||||||
|
# Clear session_state if exists
|
||||||
|
try:
|
||||||
|
db.execute('DELETE FROM session_state')
|
||||||
|
db.commit()
|
||||||
|
_log('cleared session_state table', 'reset')
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Clear stats_history if exists
|
||||||
|
try:
|
||||||
|
db.execute('DELETE FROM stats_history')
|
||||||
|
db.commit()
|
||||||
|
_log('cleared stats_history table', 'reset')
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
db.execute('VACUUM')
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
except Exception as e:
|
||||||
|
_log('database reset failed: %s' % e, 'error')
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Remove state files
|
||||||
|
state_files = [
|
||||||
|
os.path.join(data_dir, 'scraper_state.json'),
|
||||||
|
os.path.join(data_dir, 'mitm_certs.json'),
|
||||||
|
]
|
||||||
|
for f in state_files:
|
||||||
|
if os.path.exists(f):
|
||||||
|
try:
|
||||||
|
os.remove(f)
|
||||||
|
_log('removed %s' % f, 'reset')
|
||||||
|
except Exception as e:
|
||||||
|
_log('failed to remove %s: %s' % (f, e), 'error')
|
||||||
|
|
||||||
|
_log('state reset complete', 'reset')
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def format_duration(seconds):
|
def format_duration(seconds):
|
||||||
"""Format seconds into compact human-readable duration."""
|
"""Format seconds into compact human-readable duration."""
|
||||||
if seconds < 60:
|
if seconds < 60:
|
||||||
@@ -208,6 +271,14 @@ def main():
|
|||||||
"""Main entry point."""
|
"""Main entry point."""
|
||||||
global config
|
global config
|
||||||
|
|
||||||
|
# Handle --reset flag before connecting to databases
|
||||||
|
if len(sys.argv) == 2 and sys.argv[1] == "--reset":
|
||||||
|
if reset_state():
|
||||||
|
_log('use without --reset to start fresh', 'reset')
|
||||||
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
proxydb = mysqlite.mysqlite(config.watchd.database, str)
|
proxydb = mysqlite.mysqlite(config.watchd.database, str)
|
||||||
dbs.create_table_if_not_exists(proxydb, 'proxylist')
|
dbs.create_table_if_not_exists(proxydb, 'proxylist')
|
||||||
fetch.init_known_proxies(proxydb)
|
fetch.init_known_proxies(proxydb)
|
||||||
|
|||||||
Reference in New Issue
Block a user