#!/usr/bin/python
# -*- coding: utf-8 -*-

#Version: 1.6
# * Python: x >= 3.7

import site
import sys
sys.dont_write_bytecode = True

import os
from constant import *

#システムハッシュ検査に関する区分の設定

#====================================================================
#ハッシュ値計算に干渉する設定
#--------------------------------------------------------------------
CONST.ROOT_PATH = r"../.." #ROOTディレクトリへのパス
#※ 相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

CONST.ABSPATH_MODE = False #パス指定を絶対的に扱うモード

CONST.DIRECTORY_FOR_SAVE_FILE_PATH = r"./save" #保存用ファイルを格納するディレクトリまでの相対パス

#--------------------------------------------------------------------
CONST.SAVE_REMEMBER_FILE_NAME = "save_memorize_record" #検証用システムハッシュデータ保存用のファイル名(拡張子除外)

#--------------------------------------------------------------------
CONST.READ_BYTE = 1024 #取得byte数 (Noneである場合は、無制限)
CONST.READ_FIRST_FLAG = True #前読み込み
CONST.READ_LAST_FLAG = True #後ろ読み込み
CONST.BUFFER_SIZE = None #ファイルの取得ＢＵＦＦＥＲ

#--------------------------------------------------------------------
#制御用正規表現（絶対パスモードの場合は絶対パス、相対パスモードの場合は"POOT_PATH"からの相対パスとマッチングする）
#※ パス全体が正規表現パターンとマッチする場合はTrue、マッチしない場合はFalseが返される
#※ 正規表現パターンがNoneである場合や正規表現パターンが不正である場合はデフォルト値が常に返される
CONST.INCLUDE_PATH_REGEX_PATTERN = None #正規表現パターンに一致するパスのみが対象となる（デフォルトでは全てのパスを対象とする（True））
CONST.IGNORE_PATH_REGEX_PATTERN =  r"(?i)^.*\.(temp|tmp|cache)$" #正規表現パターンに一致するパスのみが無視される（デフォルトでは全てのパスを無視しない（False））
CONST.BEHOLDED_PATH_REGEX_PATTERN =  r"(?i)^.*\.(py|exe|bat|jar|class|bin|dex|js|jsp|xml|conf)$" #正規表現パターンに一致するパスのみが注視される（デフォルトでは全てのパスを注視しない（False））

#--------------------------------------------------------------------
CONST.EXCEPT_PATH_LIST = [
	
] #非読み込みパスのリスト #相対パスで指定した場合は"POOT_PATH"からの相対パスであるとみなされる

CONST.NOT_EXCEPT_PATH_LIST = [
	
] #必要な読み込みパス（アンチ・非読み込みパス）のリスト #相対パスで指定した場合は"POOT_PATH"からの相対パスであるとみなされる

#--------------------------------------------------------------------
CONST.IGNORE_CHANGE_PATH_LIST = [
	
] #変更が許容されるパスのリスト #相対パスで指定した場合は"POOT_PATH"からの相対パスであるとみなされる

CONST.NOT_IGNORE_CHANGE_PATH_LIST = [
	
] #変更が許容されないパス（アンチ・変更が許容されるパス）のリスト #相対パスで指定した場合は"POOT_PATH"からの相対パスであるとみなされる

#優先度は [読み込み系] > [無視系] > [注目系] であることに注意

#--------------------------------------------------------------------
CONST.EXCEPT_PATH_LIST_FROM_SCRIPTS_DIRECTORY = [
	r"./save",#d #データ格納ディレクトリ
	r"../Log",#d ログディレクトリ
	r"../Out",#d 出力ディレクトリ
] #非読み込みパスのリスト #相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

CONST.NOT_EXCEPT_PATH_LIST_FROM_SCRIPTS_DIRECTORY = [
	r"./inspect.py",#f #スクリプト格納ディレクトリ内に存在する比較・検証スクリプト
	r"./memorize.py",#f #スクリプト格納ディレクトリ内に存在する記録スクリプト
	r"./constant.py",#f #スクリプト格納ディレクトリ内に存在する定数管理モジュール
	r"./{0}".format(os.path.basename(__file__)),#f #スクリプト格納ディレクトリ内に存在する設定ファイル (このファイル)
	r"../Execute.bat",#f #実行バッチ
] #必要な読み込みパス（アンチ・非読み込みパス）のリスト #相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

#--------------------------------------------------------------------
CONST.IGNORE_CHANGE_PATH_LIST_FROM_SCRIPTS_DIRECTORY = [
	r"./{0}".format(os.path.basename(__file__)),#f #スクリプト格納ディレクトリ内に存在する設定ファイル (このファイル)
] #変更が許容されるパスのリスト #相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

CONST.NOT_IGNORE_CHANGE_PATH_LIST_FROM_SCRIPTS_DIRECTORY = [
	
] #変更が許容されないパス（アンチ・変更が許容されるパス）のリスト #相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

#====================================================================
#ハッシュ値計算に干渉しない設定
#--------------------------------------------------------------------
CONST.BEFOLDED_PATH_LIST = [
	
] #注目されるパスのリスト #相対パスで指定した場合は"POOT_PATH"からの相対パスであるとみなされる

CONST.NOT_BEFOLDED_PATH_LIST = [
	
] #注目されないパス（アンチ・注目されるパスのリスト）のリスト #相対パスで指定した場合は"POOT_PATH"からの相対パスであるとみなされる

#--------------------------------------------------------------------
CONST.BEFOLDED_PATH_LIST_FROM_SCRIPTS_DIRECTORY = [
	r"./inspect.py",#f #スクリプト格納ディレクトリ内に存在する比較・検証スクリプト
	r"./memorize.py",#f #スクリプト格納ディレクトリ内に存在する記録スクリプト
	r"./constant.py",#f #スクリプト格納ディレクトリ内に存在する定数管理モジュール
	r"./{0}".format(os.path.basename(__file__)),#f #スクリプト格納ディレクトリ内に存在する設定ファイル (このファイル)
	r"../Execute.bat",#f #実行バッチ
	r"../Interpreter",#d #インタプリタ
] #注目されるパスのリスト #相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

CONST.NOT_BEFOLDED_PATH_LIST_FROM_SCRIPTS_DIRECTORY = [
	
] #注目されないパス（アンチ・注目されるパスのリスト）のリスト #相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

#--------------------------------------------------------------------
#優先度は [読み込み系] > [無視系] > [注目系] であることに注意

#--------------------------------------------------------------------
#CONST.SAVE_INSPECT_FILE_NAME = "save_inspect_record" #異常オブジェクトデータの保存用のファイル名(拡張子除外)
CONST.SAVE_INSPECT_FILE_NAME = None #異常オブジェクトデータの保存用のファイル名(拡張子除外)
#Noneであるときは異常オブジェクトデータの保存用ファイルを生成しない

#--------------------------------------------------------------------
CONST.DIRECTORY_FOR_DUMP_FILE_PATH = r"../Out" #検査結果出力用のディレクトリ #相対パスで指定した場合はこのスクリプトがあるディレクトリからの相対パスであるとみなされる

CONST.DUMP_REPORT_FILE_NAME = "検査レポート" #検査結果出力用のREPORTファイル1(拡張子除外)
CONST.DUMP_REPORT_SUMMARY_FILE_NAME = "【要約版】検査レポート" #検査結果出力用のREPORTファイル2(拡張子除外)
CONST.DUMP_CSV_FILE_NAME = "検査結果ＣＳＶ" #検査結果出力用のCSVファイル3(拡張子除外)
CONST.DUMP_CSV_SUMMARY_FILE_NAME = "【要約版】検査結果ＣＳＶ" #検査結果出力用のCSVファイル4(拡張子除外)

CONST.DUMP_HTML_MODE = True #検査結果REPORTファイルをHTMLで出力するか否か(有効にする場合は'.html'、無効にする場合は'.txt'が拡張子となる)

CONST.DUMP_MODE_OF_DUMP_REPORT_FILE = True #検査結果出力用のREPORTファイル1を出力するか否かのフラグ
CONST.DUMP_MODE_OF_DUMP_SUMMARY_REPORT_FILE = True #検査結果出力用のREPORTファイル2を出力するか否かのフラグ
CONST.DUMP_MODE_OF_DUMP_CSV_FILE = True #検査結果要約用のCSVファイル3を出力するか否かのフラグ
CONST.DUMP_MODE_OF_DUMP_SUMMARY_CSV_FILE = True #検査結果要約用のCSVファイル4を出力するか否かのフラグ

CONST.DUMP_CSV_HEADER = ("結果概要", "属性概要", "パス", "異常判定フラグ", "注視対象フラグ", "無視対象フラグ", "追加判定フラグ", "破損判定フラグ", "削除判定フラグ", "エラー判定フラグ", "記録ハッシュ", "取得ハッシュ") #CSVヘッダー
CONST.DUMP_CSV_BODY_FUNCTION = lambda x: (
	"エラー" if x[7] else ("正常" if not(x[1]) else ("無視" if x[3] else ("削除" if x[6] else ("追加" if x[4] else ("破損" if x[5] else "不明"))))), #結果概要
	"エラー" if x[7] else "/".join([xx for xx in [
		"異常判定" if x[1] else "正常判定",
		"無視対象" if x[3] else ("注視対象" if x[2] else ""),
		"削除判定" if x[6] else ("追加判定" if x[4] else ("破損判定" if x[5] else "")),
	] if len(xx) > 0]), #属性概要
	str(x[0]), #パス
	"1" if x[1] else "0", #異常フラグ
	"1" if x[2] else "0", #注視フラグ
	"1" if x[3] else "0", #無視フラグ
	"1" if x[4] else "0", #追加フラグ 
	"1" if x[5] else "0", #差異フラグ 
	"1" if x[6] else "0", #削除フラグ
	"1" if x[7] else "0", #エラーフラグ
	"" if x[8] is None else str(x[8]), #記録ハッシュ
	"" if x[9] is None else str(x[9]), #取得ハッシュ
) #CSVの値構造変換用関数
#元のデータ構造は次の通り (パス, 異常フラグ, 注視フラグ, 無視フラグ, 追加フラグ, 差異フラグ, 削除フラグ, エラーフラグ, 記録ハッシュ, 取得ハッシュ)

#--------------------------------------------------------------------
CONST.ARGS_MATCH_TEXT = "SAVE" #引数にこの引数合致文字が存在する時のみ記録処理が実施される(Noneであるときは引数なしでも実施)
CONST.ARGS_ANY_MODE = False #引数合致文字が前方一致でマッチすることを許すモード

#--------------------------------------------------------------------
CONST.INCREASE_READABILITY_OF_SAVE_FILE_MODE = False #保存用jsonファイルの可読性を向上させるモード

#--------------------------------------------------------------------
CONST.PRINT_MODE = True #標準出力への出力を行うモード

#--------------------------------------------------------------------
CONST.BASE_MARKER_WHEN_INSPECT = "・" #チェック時の基本マーカー

CONST.SPECIAL_NUMBER_AND_MARKER_LIST_WHEN_INSPECT = [
	("ERROR",	"×"), #エラーとなったファイルは「×」
	("BEHOLDED", "●"), #注視ファイルは「●」
	("DELETED",  "○"), #削除ファイルは「○」（削除は正常なシステム動作には存在し無いため）
] #チェック時の特殊マーカー (優先度はリスト先頭の方が高い)
#特殊マーカー付与のための判断基準：{"ABNORMAL", "BEHOLDED", "IGNORE", "APPENDED", "CORRUPTED", "DELETED", "ERROR"}
#※ 特殊マーカー付与のための判断基準に"IGNORE"を使用しても意味がありません

#--------------------------------------------------------------------
#remember系における「ファイルのハッシュ値取得」, inspect系における「ファイルのハッシュ値照合」スレッド／プロセスの多重化設定
CONST.NUMBER_OF_TASK_ASSIGNED_TO_EACH_WORKER = 2500 #一つのスレッド／プロセスに委託する検証ファイルの数
CONST.MAXIMUM_NUMBER_OF_WORKERS = 8 #一度に生成するスレッド／プロセスの最大数（1未満にした場合、現行のスレッド／プロセスで実行する）

CONST.USE_PROCESS_MODE = True #プロセスを使用するモード（有効でない場合はスレッドを使用する）

CONST.SHUFFLE_FILE_ORDER_MODE = True #ハッシュ値計算スレッド／プロセスに渡すファイルリストをランダムにシャッフルするモード
#SSDである場合は、ランダムアクセスによる遅延よりもファイル平準化によるタスク量分散による恩恵の方が大きいため、True推奨
#HDDである場合は、ランダムアクセスによる遅延が顕著になるため、対象を考えて設定する必要あり
#また、ファイルリストのサイズが大きい場合、シャッフルに一定の時間がかかることに注意

#--------------------------------------------------------------------
CONST.IGNORE_CONFIG_HASH_MODE = False #設定ハッシュの比較結果を無視するモード #※ 非活性化推奨

#********************************************************************
CONST.seal() #定数をロック

#********************************************************************
show = lambda x: CONST.show() #定数表示

if "__main__" == __name__:
	return_code = show(sys.argv)
	#CONST.show_counter() #アクセスカウント表示
	sys.exit(return_code)
