0
�
355Å¿Æ c
404 Not Found
Not Found
The requested URL was not found on this server.
Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.
; ˆl–äY>”ÊC]Šq@¹p,Üh
bÑ¿Ê
„È?Éa–Ãa¾”*j"Tâ€ÀàB¦-ÿÈ 'ö #!/usr/bin/python3
"""Tool for manipulating the nfsdcld sqlite database
"""
__copyright__ = """
Copyright (C) 2019 Scott Mayhew
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
"""
import argparse
import os
import sqlite3
import sys
class CldDb():
def __init__(self, path):
self.con = sqlite3.connect(path)
self.con.row_factory = sqlite3.Row
for row in self.con.execute('select value from parameters '
'where key = "version"'):
self.version = int(row['value'])
for row in self.con.execute('select * from grace'):
self.current = int(row['current'])
self.recovery = int(row['recovery'])
def __del__(self):
self.con.close()
def __str__(self):
return ('Schema version: {self.version} '
'current epoch: {self.current} '
'recovery epoch: {self.recovery}'.format(self=self))
def _print_clients(self, epoch):
if epoch:
for row in self.con.execute('select * from "rec-{:016x}"'
.format(epoch)):
if self.version >= 4:
if row['princhash'] is not None:
princhash = row['princhash'].hex()
else:
princhash = "(null)"
print('id = {}, princhash = {}'
.format(row['id'].decode(), princhash))
else:
print('id = {}'.format(row['id'].decode()))
def print_current_clients(self):
print('Clients in current epoch:')
self._print_clients(self.current)
def print_recovery_clients(self):
if self.recovery:
print('Clients in recovery epoch:')
self._print_clients(self.recovery)
def check_bad_table_names(self):
bad_names = []
for row in self.con.execute('select name from sqlite_master '
'where type = "table" '
'and name like "%rec-%" '
'and length(name) < 20'):
bad_names.append(row['name'])
return bad_names
def fix_bad_table_names(self):
try:
self.con.execute('begin exclusive transaction')
bad_names = self.check_bad_table_names()
for bad_name in bad_names:
epoch = int(bad_name.split('-')[1], base=16)
if epoch == self.current or epoch == self.recovery:
if epoch == self.current:
which = 'current'
else:
which = 'recovery'
print('found invalid table name {} for {} epoch'
.format(bad_name, which))
self.con.execute('alter table "{}" '
'rename to "rec-{:016x}"'
.fo