site_backups alpha version released!

Alpha Version

PokeyHost v0.1-alpha

The website backups utility is functioning in a limited capacity, there are few a still bugs to iron out but runs are succeeding without error and the results are as expected.

While I was intending to use the MySQLdb module to handle all database activities, I opted to use it instead only for the connectivity and diagnostic testing portion of the application.  When it comes to actually dumping the data, mysqldump is a simpler (and faster in some cases) solution.

The test database diagnostic section is as follows :

def test_load(self):
		""" Prepare test for execution """
		
		if isinstance(self.conf.db_names[0],basestring):
			test_db = self.conf.db_names[0]
		else:
			test_db = self.conf.db_names[0][0]
		
		mysql_tests = ["SELECT VERSION();",
				"SHOW SESSION STATUS;",
				"SHOW TABLES FROM {0};".format(test_db)
				]
		db_results = []
		
		self.logger.debug("[*] *** TEST MODE ENGAGED ***")
			
		# Optional test name
		self.test_name = self.user_input('\t> Enter name for this test (Enter to skip) : ')
		
		if self.test_name == '':
			self.test_name = 'Unnamed Test'
		self.logger.debug('\tTest name : {0}'.format(self.test_name))
		
		if self.user_input('\t> Verbose output? (y/n) : ').upper()=='Y':
			self.verbose=True
		else:
			self.verbose=False
			
		# Test database connectivity
		self.logger.info('\t*** Database test')
		
		success_count=0
		
		for test in mysql_tests:
			res = self.do_db_query(test_db,test)
			if len(res) > 0:
				self.logger.info('\t*** Test succeeded')
				success_count+=1
			db_results.extend(res)
			
		self.fpath = fw.resource_path(__file__,'./includes/test_dir')
		self.dest = fw.resource_path(__file__,'./tmp')
		
		# Write database output
		db_outpath = '{0}{1}'.format(self.dest,'/_DB_TEST_OUPUT.TXT')
		self.logger.debug('\tWriting database test info to {0}'.format(db_outpath))
		with open(db_outpath,'wb') as o:
			for row in db_results: 
			 	try:
			 		outp = '{0:<45}{1:<25}\n'.format(*row)
				except IndexError:
					outp = '{0:<70}\n'.format(row[0])
				if self.verbose: self.logger.debug('\t{0}'.format(outp.rstrip()))
				o.write(outp)
				
		# If test was successful, proceed with database backup
		if success_count==3:
			self.dbs = self.conf.db_names[0]

In a nutshell, the query list mysql_tests = [“SELECT VERSION();”,”SHOW SESSION STATUS;”,”SHOW TABLES FROM {0};”.format(test_db)] is executed over a MySQLdb connection to ensure credentials are valid and the database is accessible.  This is a stop-gap solution until a more definite diagnostic module can be constructed.  Ultimately, this tool will incorporate a pre- and post- backup diagnostics module with various warning conditions.  As it exists, there are only two diagnostics running.

  1. The MySQLdb-executed queries in the example
    • Test connectivity to the DB host
    • Test credential authentication
    • Ensure data is returned successfully
  2. The initial execution partition status check
    • Examines available space on the partition
      • Need to build out warnings and error states
    • Checks read and read/write status of the source and destination directories, respectively.
    • *Next release to contain destination space availability check

The output

There is a verbosity flag available, [-v|–verbose] , which will enable long config, file, and database output during the run.  I invested a lot of effort into making sure adequate logging is in place, and I plan on expanding on this quite a bit in the refinement process.

The next release for this tool will contain a [-f|–force] option in order to force continue when certain error conditions are met.

  1. A file cannot be added to the archive
    • This condition currently automatically continues
    • Once the force option is implemented the user will be presented with the option to cancel the operation
    • Current warning :
      • Could not add file “/home1/wnrmndn/pokeyhost/tools/tmp/wnrmndn_hgtools.sql” to the archive, continuing
  2. The database backup fails
    • The user is prompted with the option to proceed
    • Once the force option is implemented, input can be skipped
    • Current warning:
      • > Database backup failed! Proceed? (y=yes) :

There are several other prompts (like the test verbosity prompt, which adds even more output to the test run) which will ultimately be capable of being forced.

Testing Only

I’ve only tested the [-t|–test] flag extensively for output at this point, two or three cursory runs with command-line passed path, database, and  destination arguments did complete successfully with the test datasets, but I haven’t played with the options or tried any gotcha type conditions.  Sample output:

[~/pokeyhost/tools]# python site_backups.py -t -v
[*] Application Spawned
[*] Logger Spawned
[*] Pre-Run Checks
	Checking /home1/wnrmndn/pokeyhost/includes
	Folder /home1/wnrmndn/pokeyhost/includes not found, creating.
	Checking /home1/wnrmndn/pokeyhost/tmp
	Folder /home1/wnrmndn/pokeyhost/tmp not found, creating.
	Checking execution partition usage
	/dev/root : 653710/1877144kb used : 1204346kb available (36%) : mountpoint=/home1/wnrmndn
	Pre-Run checks completed
	Took  0.00261 seconds
[*] Loading Application
[*] Loading Configuration from ./pokeyhost.conf
	version        =	0.1                 	Development Version           
	def_dest       =	./default_output    	Default output destination folder
	def_archive    =	default_archive     	Default archive name          
	db_names       =	wnrmndn_hgtools     	Default Database (command-line supercedes this value)
	db_host        =	localhost           	Database Host Name            
	db_type        =	mysql               	Type of Database (Currently only MySQL supported)
	db_user        =	wnrmndn_pokeyhst    	Database Username             
	db_password    =	~R!B!zcgc]S}        	Database password             
	use_unicode    =	False               	Sets default encoding for CHAR,VARCHAR, and TEXT
	db_port        =	3306                	Database connection port      
	comp           =	w:gz                	Mode / Compression Algorithm [w|w:gz|w:bz2]
	Took  0.00946 seconds
[*] Parsing Arguments
	Logging Mode Enabled
	self.logger.level = logging.DEBUG
	Arguments parsed
	Took  0.00101 seconds
[*] *** TEST MODE ENGAGED ***
	> Enter name for this test (Enter to skip) : 
	Test name : Unnamed Test
	> Verbose output? (y/n) : y
	*** Database test
[*] Database query
	Connecting...
	Host: localhost
	User: wnrmndn_pokeyhst
	Database: wnrmndn_pokeyhst
	SQL = SELECT VERSION();
	Returned 1 rows
	Database operation took  0.02172 seconds
	*** Test succeeded
[*] Database query
	Connecting...
	Host: localhost
	User: wnrmndn_pokeyhst
	Database: wnrmndn_pokeyhst
	SQL = SHOW SESSION STATUS;
	Returned 376 rows
	Database operation took  0.00229 seconds
	*** Test succeeded
[*] Database query
	Connecting...
	Host: localhost
	User: wnrmndn_pokeyhst
	Database: wnrmndn_pokeyhst
	SQL = SHOW TABLES FROM wnrmndn_hgtools;
	Returned 6 rows
	Database operation took  0.00178 seconds
	*** Test succeeded
	Writing database test info to /home1/wnrmndn/pokeyhost/tools/tmp/_DB_TEST_OUPUT.TXT
	5.5.42-37.1
	Aborted_clients                              21069
	Aborted_connects                             403461
	Binlog_cache_disk_use                        0
	Binlog_cache_use                             0
	Binlog_stmt_cache_disk_use                   0
	Binlog_stmt_cache_use                        0
	Bytes_received                               158
	Bytes_sent                                   105
	Com_admin_commands                           0
	Com_assign_to_keycache                       0
	Com_alter_db                                 0
	Com_alter_db_upgrade                         0
	Com_alter_event                              0
	Com_alter_function                           0
	Com_alter_procedure                          0
	Com_alter_server                             0
	Com_alter_table                              0
	Com_alter_tablespace                         0
	Com_analyze                                  0
	Com_begin                                    0
	Com_binlog                                   0
	Com_call_procedure                           0
	Com_change_db                                0
	Com_change_master                            0
	Com_check                                    0
	Com_checksum                                 0
	Com_commit                                   0
	Com_create_db                                0
	Com_create_event                             0
	Com_create_function                          0
	Com_create_index                             0
	Com_create_procedure                         0
	Com_create_server                            0
	Com_create_table                             0
	Com_create_trigger                           0
	Com_create_udf                               0
	Com_create_user                              0
	Com_create_view                              0
	Com_dealloc_sql                              0
	Com_delete                                   0
	Com_delete_multi                             0
	Com_do                                       0
	Com_drop_db                                  0
	Com_drop_event                               0
	Com_drop_function                            0
	Com_drop_index                               0
	Com_drop_procedure                           0
	Com_drop_server                              0
	Com_drop_table                               0
	Com_drop_trigger                             0
	Com_drop_user                                0
	Com_drop_view                                0
	Com_empty_query                              0
	Com_execute_sql                              0
	Com_flush                                    0
	Com_grant                                    0
	Com_ha_close                                 0
	Com_ha_open                                  0
	Com_ha_read                                  0
	Com_help                                     0
	Com_insert                                   0
	Com_insert_select                            0
	Com_install_plugin                           0
	Com_kill                                     0
	Com_load                                     0
	Com_lock_tables                              0
	Com_optimize                                 0
	Com_preload_keys                             0
	Com_prepare_sql                              0
	Com_purge                                    0
	Com_purge_before_date                        0
	Com_release_savepoint                        0
	Com_rename_table                             0
	Com_rename_user                              0
	Com_repair                                   0
	Com_replace                                  0
	Com_replace_select                           0
	Com_reset                                    0
	Com_resignal                                 0
	Com_revoke                                   0
	Com_revoke_all                               0
	Com_rollback                                 0
	Com_rollback_to_savepoint                    0
	Com_savepoint                                0
	Com_select                                   0
	Com_set_option                               1
	Com_signal                                   0
	Com_show_authors                             0
	Com_show_binlog_events                       0
	Com_show_binlogs                             0
	Com_show_charsets                            0
	Com_show_client_statistics                   0
	Com_show_collations                          0
	Com_show_contributors                        0
	Com_show_create_db                           0
	Com_show_create_event                        0
	Com_show_create_func                         0
	Com_show_create_proc                         0
	Com_show_create_table                        0
	Com_show_create_trigger                      0
	Com_show_databases                           0
	Com_show_engine_logs                         0
	Com_show_engine_mutex                        0
	Com_show_engine_status                       0
	Com_show_events                              0
	Com_show_errors                              0
	Com_show_fields                              0
	Com_show_function_status                     0
	Com_show_grants                              0
	Com_show_index_statistics                    0
	Com_show_keys                                0
	Com_show_master_status                       0
	Com_show_open_tables                         0
	Com_show_plugins                             0
	Com_show_privileges                          0
	Com_show_procedure_status                    0
	Com_show_processlist                         0
	Com_show_profile                             0
	Com_show_profiles                            0
	Com_show_relaylog_events                     0
	Com_show_slave_hosts                         0
	Com_show_slave_status                        0
	Com_show_slave_status_nolock                 0
	Com_show_status                              1
	Com_show_storage_engines                     0
	Com_show_table_statistics                    0
	Com_show_table_status                        0
	Com_show_tables                              0
	Com_show_temporary_tables                    0
	Com_show_thread_statistics                   0
	Com_show_triggers                            0
	Com_show_user_statistics                     0
	Com_show_variables                           0
	Com_show_warnings                            0
	Com_slave_start                              0
	Com_slave_stop                               0
	Com_stmt_close                               0
	Com_stmt_execute                             0
	Com_stmt_fetch                               0
	Com_stmt_prepare                             0
	Com_stmt_reprepare                           0
	Com_stmt_reset                               0
	Com_stmt_send_long_data                      0
	Com_truncate                                 0
	Com_uninstall_plugin                         0
	Com_unlock_tables                            0
	Com_update                                   0
	Com_update_multi                             0
	Com_xa_commit                                0
	Com_xa_end                                   0
	Com_xa_prepare                               0
	Com_xa_recover                               0
	Com_xa_rollback                              0
	Com_xa_start                                 0
	Compression                                  OFF
	Connections                                  56413680
	Created_tmp_disk_tables                      0
	Created_tmp_files                            12590535
	Created_tmp_tables                           0
	Delayed_errors                               0
	Delayed_insert_threads                       0
	Delayed_writes                               10559
	Flashcache_enabled                           OFF
	Flush_commands                               1
	Handler_commit                               0
	Handler_delete                               0
	Handler_discover                             0
	Handler_prepare                              0
	Handler_read_first                           0
	Handler_read_key                             0
	Handler_read_last                            0
	Handler_read_next                            0
	Handler_read_prev                            0
	Handler_read_rnd                             0
	Handler_read_rnd_next                        0
	Handler_rollback                             0
	Handler_savepoint                            0
	Handler_savepoint_rollback                   0
	Handler_update                               0
	Handler_write                                0
	Innodb_adaptive_hash_cells                   276671
	Innodb_adaptive_hash_heap_buffers            42
	Innodb_adaptive_hash_hash_searches           68371063845
	Innodb_adaptive_hash_non_hash_searches       26761233511
	Innodb_background_log_sync                   2926138
	Innodb_buffer_pool_pages_data                8140
	Innodb_buffer_pool_bytes_data                133365760
	Innodb_buffer_pool_pages_dirty               112
	Innodb_buffer_pool_bytes_dirty               1835008
	Innodb_buffer_pool_pages_flushed             295696333
	Innodb_buffer_pool_pages_LRU_flushed         138227160
	Innodb_buffer_pool_pages_free                0
	Innodb_buffer_pool_pages_made_not_young      0
	Innodb_buffer_pool_pages_made_young          31277385683
	Innodb_buffer_pool_pages_misc                51
	Innodb_buffer_pool_pages_old                 2984
	Innodb_buffer_pool_pages_total               8191
	Innodb_buffer_pool_read_ahead_rnd            0
	Innodb_buffer_pool_read_ahead                23207150654
	Innodb_buffer_pool_read_ahead_evicted        794547200
	Innodb_buffer_pool_read_requests             1135766572324
	Innodb_buffer_pool_reads                     7800972823
	Innodb_buffer_pool_wait_free                 595
	Innodb_buffer_pool_write_requests            1899944513
	Innodb_checkpoint_age                        51236
	Innodb_checkpoint_max_age                    7782360
	Innodb_checkpoint_target_age                 7539162
	Innodb_data_fsyncs                           66941183
	Innodb_data_pending_fsyncs                   0
	Innodb_data_pending_reads                    0
	Innodb_data_pending_writes                   0
	Innodb_data_read                             508079525670912
	Innodb_data_reads                            31008939890
	Innodb_data_writes                           350043853
	Innodb_data_written                          11595014183424
	Innodb_dblwr_pages_written                   295696333
	Innodb_dblwr_writes                          3030090
	Innodb_deadlocks                             5
	Innodb_dict_tables                           54870
	Innodb_have_atomic_builtins                  ON
	Innodb_history_list_length                   1665
	Innodb_ibuf_discarded_delete_marks           445
	Innodb_ibuf_discarded_deletes                1
	Innodb_ibuf_discarded_inserts                77
	Innodb_ibuf_free_list                        2213
	Innodb_ibuf_merged_delete_marks              1461563
	Innodb_ibuf_merged_deletes                   390654
	Innodb_ibuf_merged_inserts                   4522315
	Innodb_ibuf_merges                           1701518
	Innodb_ibuf_segment_size                     2215
	Innodb_ibuf_size                             1
	Innodb_log_waits                             363
	Innodb_log_write_requests                    3697560897
	Innodb_log_writes                            48117219
	Innodb_lsn_current                           11126554793894
	Innodb_lsn_flushed                           11126554793894
	Innodb_lsn_last_checkpoint                   11126554742658
	Innodb_master_thread_1_second_loops          2908320
	Innodb_master_thread_10_second_loops         290824
	Innodb_master_thread_background_loops        192
	Innodb_master_thread_main_flush_loops        192
	Innodb_master_thread_sleeps                  2908293
	Innodb_max_trx_id                            13834215244
	Innodb_mem_adaptive_hash                     2922096
	Innodb_mem_dictionary                        472094240
	Innodb_mem_total                             137756672
	Innodb_mutex_os_waits                        19400297
	Innodb_mutex_spin_rounds                     16152773669
	Innodb_mutex_spin_waits                      6589556503
	Innodb_oldest_view_low_limit_trx_id          13834215144
	Innodb_os_log_fsyncs                         48211416
	Innodb_os_log_pending_fsyncs                 0
	Innodb_os_log_pending_writes                 0
	Innodb_os_log_written                        1905380575744
	Innodb_page_size                             16384
	Innodb_pages_created                         74823446
	Innodb_pages_read                            31010730031
	Innodb_pages_written                         295696333
	Innodb_purge_trx_id                          13834215120
	Innodb_purge_undo_no                         0
	Innodb_row_lock_current_waits                0
	Innodb_current_row_locks                     0
	Innodb_row_lock_time                         279771
	Innodb_row_lock_time_avg                     14
	Innodb_row_lock_time_max                     10767
	Innodb_row_lock_waits                        19095
	Innodb_rows_deleted                          11055682
	Innodb_rows_inserted                         22826502
	Innodb_rows_read                             1213225059024
	Innodb_rows_updated                          32274497
	Innodb_read_views_memory                     704
	Innodb_descriptors_memory                    8000
	Innodb_s_lock_os_waits                       2610743148
	Innodb_s_lock_spin_rounds                    225004713048
	Innodb_s_lock_spin_waits                     11427955254
	Innodb_truncated_status_writes               0
	Innodb_x_lock_os_waits                       11663887
	Innodb_x_lock_spin_rounds                    1202955712
	Innodb_x_lock_spin_waits                     82867325
	Key_blocks_not_flushed                       0
	Key_blocks_unused                            0
	Key_blocks_used                              6698
	Key_read_requests                            211006305463
	Key_reads                                    1882374637
	Key_write_requests                           793879001
	Key_writes                                   192561184
	Last_query_cost                              0.000000
	Max_used_connections                         141
	Not_flushed_delayed_rows                     0
	Open_files                                   17118
	Open_streams                                 0
	Open_table_definitions                       15561
	Open_tables                                  16800
	Opened_files                                 607073468
	Opened_table_definitions                     0
	Opened_tables                                0
	Performance_schema_cond_classes_lost         0
	Performance_schema_cond_instances_lost       0
	Performance_schema_file_classes_lost         0
	Performance_schema_file_handles_lost         0
	Performance_schema_file_instances_lost       0
	Performance_schema_locker_lost               0
	Performance_schema_mutex_classes_lost        0
	Performance_schema_mutex_instances_lost      0
	Performance_schema_rwlock_classes_lost       0
	Performance_schema_rwlock_instances_lost     0
	Performance_schema_table_handles_lost        0
	Performance_schema_table_instances_lost      0
	Performance_schema_thread_classes_lost       0
	Performance_schema_thread_instances_lost     0
	Prepared_stmt_count                          0
	Qcache_free_blocks                           0
	Qcache_free_memory                           0
	Qcache_hits                                  0
	Qcache_inserts                               0
	Qcache_lowmem_prunes                         0
	Qcache_not_cached                            0
	Qcache_queries_in_cache                      0
	Qcache_total_blocks                          0
	Queries                                      3168639395
	Questions                                    2
	Rpl_status                                   AUTH_MASTER
	Select_full_join                             0
	Select_full_range_join                       0
	Select_range                                 0
	Select_range_check                           0
	Select_scan                                  0
	Slave_heartbeat_period                       0.000
	Slave_open_temp_tables                       0
	Slave_received_heartbeats                    0
	Slave_retried_transactions                   0
	Slave_running                                OFF
	Slow_launch_threads                          0
	Slow_queries                                 0
	Sort_merge_passes                            0
	Sort_range                                   0
	Sort_rows                                    0
	Sort_scan                                    0
	Ssl_accept_renegotiates                      0
	Ssl_accepts                                  3
	Ssl_callback_cache_hits                      0
	Ssl_cipher
	Ssl_cipher_list
	Ssl_client_connects                          0
	Ssl_connect_renegotiates                     0
	Ssl_ctx_verify_depth                         18446744073709551615
	Ssl_ctx_verify_mode                          5
	Ssl_default_timeout                          0
	Ssl_finished_accepts                         1
	Ssl_finished_connects                        0
	Ssl_session_cache_hits                       0
	Ssl_session_cache_misses                     0
	Ssl_session_cache_mode                       SERVER
	Ssl_session_cache_overflows                  0
	Ssl_session_cache_size                       128
	Ssl_session_cache_timeouts                   0
	Ssl_sessions_reused                          0
	Ssl_used_session_cache_entries               1
	Ssl_verify_depth                             0
	Ssl_verify_mode                              0
	Ssl_version
	Table_locks_immediate                        3381886342
	Table_locks_waited                           170167
	Tc_log_max_pages_used                        0
	Tc_log_page_size                             0
	Tc_log_page_waits                            0
	Threadpool_idle_threads                      0
	Threadpool_threads                           0
	Threads_cached                               54
	Threads_connected                            12
	Threads_created                              529
	Threads_running                              1
	Uptime                                       2924145
	Uptime_since_flush_status                    2924145
	binlog_commits                               0
	binlog_group_commits                         0
	hgtools
	hgtools_about
	hgtools_codes
	hgtools_log
	hgtools_online
	hgtools_users
	*** File backup test
	Backing up pokeyhost/resources/test_dir to pokeyhost/tmp
	Path = /home1/wnrmndn/pokeyhost/tools/includes/test_dir
	Destination = /home1/wnrmndn/pokeyhost/tools/tmp
[*] Executing
[*] Database Backup
	Database : wnrmndn_hgtools
	Temp file path : tmp/wnrmndn_hgtools.sql
	Database backup succeeded!
	Added tmp/wnrmndn_hgtools.sql to the archive file list
[*] Archiving Files
	Compression : w:gz
	Archive path : /home1/wnrmndn/pokeyhost/tools/tmp/default_archive.tar.gz
	Populating file list
		Reading /home1/wnrmndn/pokeyhost/tools/includes/test_dir
	Files to Archive
	Could not add file "/home1/wnrmndn/pokeyhost/tools/tmp/wnrmndn_hgtools.sql" to the archive, continuing
	     1 8th copy of test_file_001.txt
	     2 49th copy of test_file_001.txt
	     3 24th copy of test_file_001.txt
	     4 another copy of test_file_001.txt
	     5 third copy of test_file_001.txt
	     6 4th copy of test_file_001.txt
	     7 12th copy of test_file_001.txt
	     8 19th copy of test_file_001.txt
	     9 18th copy of test_file_001.txt
	    10 41th copy of test_file_001.txt
	    11 16th copy of test_file_001.txt
	    12 25th copy of test_file_001.txt
	    13 38th copy of test_file_001.txt
	    14 48th copy of test_file_001.txt
	    15 53th copy of test_file_001.txt
	    16 27th copy of test_file_001.txt
	    17 28th copy of test_file_001.txt
	    18 15th copy of test_file_001.txt
	    19 31th copy of test_file_001.txt
	    20 52th copy of test_file_001.txt
	    21 6th copy of test_file_001.txt
	    22 13th copy of test_file_001.txt
	    23 56th copy of test_file_001.txt
	    24 40th copy of test_file_001.txt
	    25 54th copy of test_file_001.txt
	    26 46th copy of test_file_001.txt
	    27 36th copy of test_file_001.txt
	    28 29th copy of test_file_001.txt
	    29 20th copy of test_file_001.txt
	    30 10th copy of test_file_001.txt
	    31 23th copy of test_file_001.txt
	    32 45th copy of test_file_001.txt
	    33 37th copy of test_file_001.txt
	    34 32th copy of test_file_001.txt
	    35 22th copy of test_file_001.txt
	    36 26th copy of test_file_001.txt
	    37 47th copy of test_file_001.txt
	    38 50th copy of test_file_001.txt
	    39 17th copy of test_file_001.txt
	    40 44th copy of test_file_001.txt
	    41 test_file_001.txt
	    42 42th copy of test_file_001.txt
	    43 51th copy of test_file_001.txt
	    44 5th copy of test_file_001.txt
	    45 9th copy of test_file_001.txt
	    46 21th copy of test_file_001.txt
	    47 copy of test_file_001.txt
	    48 55th copy of test_file_001.txt
	    49 57th copy of test_file_001.txt
	    50 39th copy of test_file_001.txt
	    51 7th copy of test_file_001.txt
	    52 33th copy of test_file_001.txt
	    53 14th copy of test_file_001.txt
	    54 35th copy of test_file_001.txt
	    55 58th copy of test_file_001.txt
	    56 43th copy of test_file_001.txt
	    57 30th copy of test_file_001.txt
	    58 .hidden_files
	    59 34th copy of test_file_001.txt
	    60 11th copy of test_file_001.txt
[*] Application Ending
	Executed :  0.55469 seconds
	Paused   :  4.46266 seconds
	Existed  :  5.01764 seconds

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.