Skip to main content

Lista de Formatos Obsoletos e em Risco usando o Siegfried

Siegfried é uma alternativa ao DROID, mais moderna e sem dependência de Java:

# Instalar Siegfried
wget https://github.com/richardlehane/siegfried/releases/download/v1.11.2/siegfried_1-11-2_linux64.zip
unzip siegfried_1-11-2_linux64.zip
sudo cp sf /usr/local/bin/
sudo cp roy /usr/local/bin/

# Atualizar assinaturas PRONOM
sf -update

# Executar varredura
sf -csv /var/archivematica/sharedDirectory/transferSource/dataverse/dataverse/ > report.csv

ScriptNo Pythondiretório para/opt/scripts-preservacao/checar-obsolescencia/scripts usardo Siegfriedservidor node01-archivematica foi criado o script abaixo:

#!/usr/bin/envrun_obsolescence_check_siegfried.sh
python3|- #email_config.sh scan_siegfried.(carrega as variáveis para funcionar o envio de mensagem)
|- repositories_config.sh (carrega a variável REPOSITORIES com a relação de pastas que serão monitoradas)
|- pronom_obsolescence_checker.py import(Gera subprocesslista importde csvformatos importobsoletos json(PRONOM)
from|- datetimescan_siegfried_multi.sh import(Executando datetimevarredura fromSiegfried)
pathlib|- importconsolidate_siegfried_reports.py Path(Executar defconsolidação scan_with_siegfried(repository_path,e output_dir='salvar toda a saída)
|- check_obsolescence_in_droid.py (Analisar obsolescência)
|- generate_comprehensive_report.py (Gerar HTML abrangente)
|- send_email_report.py (Enviar email)

Caso queira alterar as credenciais do e-mail, basta editar o email_config.sh

Caso queira alterar (adicionar/remover) diretório, basta editar o repositories_config.sh

Foi adicionado no crontab para que fosse executado todo dia 07 de cada mês

0 2 7 * * /opt/scripts-preservacao/siegfried/reports'):checar-obsolescencia/scripts/run_obsolescence_check_siegfried.sh """>> Varredura usando Siegfried /opt/scripts-preservacao/checar-obsolescencia/logs/cron_$(alternativa ao DROID)
    """
    
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    
    date_str = datetime.now().strftime('%Y%m%d_%H%M%S')
    csv_output = f"{output_dir}/siegfried_report_{date_str}.csv"
    json_output = f"{output_dir}/siegfried_report_{date_str}.json"
    
    print(f"=== Varredura Siegfried ===")
    print(f"Repositório: {repository_path}")
    print(f"Iniciando varredura...")
    
    # Executar Siegfried em formato CSV
    with open(csv_output, 'w') as f:
        subprocess.run(
            ['sf', '-csv', repository_path],
            stdout=f,
            check=True
        )
    
    print(f"Relatório CSV gerado: {csv_output}")
    
    # Executar Siegfried em formato JSON
    with open(json_output, 'w') as f:
        subprocess.run(
            ['sf', '-json', repository_path],
            stdout=f,
            check=True
        )
    
    print(f"Relatório JSON gerado: {json_output}")
    
    # Análise básica
    analyze_siegfried_report(csv_output)
    
    return csv_output, json_output

def analyze_siegfried_report(csv_file):
    """Analisa relatório do Siegfried"""
    
    formats = {}
    total_files = 0
    unidentified = 0
    
    with open(csv_file, 'r') as f:
        reader = csv.DictReader(f)
        
        for row in reader:
            total_filesdate +=\%Y\%m).log 2>&1
            
            fmt = row.get('format', 'UNKNOWN')
            
            if fmt == 'UNKNOWN' or not fmt:
                unidentified += 1
            else:
                formats[fmt] = formats.get(fmt, 0) + 1
    
    print(f"\n=== Estatísticas ===")
    print(f"Total de arquivos: {total_files}")
    print(f"Arquivos não identificados: {unidentified}")
    print(f"Formatos únicos: {len(formats)}")
    print(f"\nTop 10 formatos:")
    
    sorted_formats = sorted(formats.items(), key=lambda x: x[1], reverse=True)
    for fmt, count in sorted_formats[:10]:
        print(f"  {fmt}: {count}")
    
    # Salvar análise
    analysis = {
        'timestamp': datetime.now().isoformat(),
        'total_files': total_files,
        'unidentified': unidentified,
        'unique_formats': len(formats),
        'formats': formats
    }
    
    analysis_file = csv_file.replace('.csv', '_analysis.json')
    with open(analysis_file, 'w') as f:
        json.dump(analysis, f, indent=2)
    
    print(f"\nAnálise salva em: {analysis_file}")

if __name__ == "__main__":
    import sys
    
    if len(sys.argv) < 2:
        print("Uso: python scan_siegfried.py <caminho_repositorio>")
        sys.exit(1)
    
    repository = sys.argv[1]
    scan_with_siegfried(repository)

Recomendação

 

Opção 1 (Melhor): Atualizar para Java 21 e usar DROID

  • Mais completo e preciso
  • Mantém compatibilidade com PRONOM oficial
  • Interface gráfica disponível se necessário

Opção 2 (Alternativa): Usar Siegfried

  • Não requer Java
  • Mais rápido e leve
  • Usa mesmas assinaturas PRONOM
  • Perfeito para linha de comando

Execute os comandos de instalação do Java 21 e depois tente novamente o DROID!