Last active
July 18, 2019 00:38
-
-
Save iNecas/262ac10a200f1a004a8f57cd3e4371f9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
function export-csv () { | |
echo "Exporting $2" | |
echo "COPY ($1) TO STDOUT WITH CSV;" | su - postgres -c '/usr/bin/psql -d foreman' > $2 | |
} | |
function import-csv () { | |
echo "Importing $2" | |
su - postgres -c "/usr/bin/psql -d $IMPORT_DATABASE -c 'COPY $1 FROM STDIN WITH CSV'" <$2 | |
} | |
function run-dynflow () { | |
block=${1:-false} | |
cat <<EOF | sudo -u postgres scl enable tfm ruby | |
require 'dynflow' | |
config = Dynflow::Config.new | |
config.persistence_adapter = Dynflow::PersistenceAdapters::Sequel.new "postgres://postgres@/$IMPORT_DATABASE" | |
config.logger_adapter = Dynflow::LoggerAdapters::Simple.new STDERR, 4 | |
config.auto_rescue = false | |
config.auto_execute = false | |
config.auto_validity_check = false | |
config.auto_terminate = false | |
world = Dynflow::World.new(config) | |
if $block | |
require 'dynflow/web' | |
dynflow_console = Dynflow::Web.setup do | |
set :world, world | |
end | |
puts "\n The Dynflow console is starting. To increase the page size, use 'per_page=1000' in web query\n\n" | |
Rack::Server.new(:app => dynflow_console, :Port => 4567).start | |
end | |
EOF | |
} | |
function dynflow-import () { | |
sudo su - postgres -c "createdb $IMPORT_DATABASE" | |
# prepare db schema | |
run-dynflow | |
# load data | |
import-csv dynflow_execution_plans dynflow_execution_plans.csv | |
import-csv dynflow_actions dynflow_actions.csv | |
import-csv dynflow_steps dynflow_steps.csv | |
# run web console | |
run-dynflow true | |
} | |
function dynflow-export () { | |
export-csv "select dynflow_execution_plans.* from foreman_tasks_tasks join dynflow_execution_plans on (foreman_tasks_tasks.external_id = dynflow_execution_plans.uuid) where foreman_tasks_tasks.started_at > 'now'::timestamp - '2 months'::interval" dynflow_execution_plans.csv | |
export-csv "select dynflow_actions.* from foreman_tasks_tasks join dynflow_actions on (foreman_tasks_tasks.external_id = dynflow_actions.execution_plan_uuid) where foreman_tasks_tasks.started_at > 'now'::timestamp - '2 months'::interval" dynflow_actions.csv | |
export-csv "select dynflow_steps.* from foreman_tasks_tasks join dynflow_steps on (foreman_tasks_tasks.external_id = dynflow_steps.execution_plan_uuid) where foreman_tasks_tasks.started_at > 'now'::timestamp - '2 months'::interval" dynflow_steps.csv | |
export-csv "select * from foreman_tasks_tasks" foreman_tasks_tasks.csv | |
export-csv "select * from dynflow_schema_info" dynflow_schema_info.csv | |
} | |
operation=$1 | |
shift | |
case $operation in | |
import ) | |
IMPORT_DATABASE=${1:-dynflow-import} | |
dynflow-import;; | |
export ) | |
dynflow-export ;; | |
* ) | |
cat <<HELP | |
Usage: | |
Export dynflow data to CSV files inside current directory: | |
dynflow-csv export | |
Import CSV data from current directory | |
dynflow-csv import [database-name] | |
* database-name - what database to use for loading the data? "dynflow-import" by default | |
HELP | |
esac |
"createdb $IMPORT_DATABASE" (why I can't comment individual lines?): I suggest improvement: if the db already exist, drop it first (or make the drop optional) - we will often use the same machine for importing different task "exports" and need some cleanup.
Worth to mention in usage/help or in stdout, that the WebUI is running on $(hostname):4567
Tiny bug in dynflow(?): clicking twice to sort per time shall sort in descending order, but ascending order (from 1st change) remains. But browser knows button "Back" :)
Otherwise great.
Another (monkey) improvement since on my rails (rubygem-rails-4.2.6-1
, for foreman
1.15
/ Satellite 6.3), the app listens on localhost
only - let it listen on its hostname's IP rather:
..
require 'socket'
Rack::Server.new(:app => dynflow_console, :Port => 4567, :Host => Socket.gethostname).start
..
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
For now, we don't ened the dynflow_schema_info: we let the dynflow to recreate the schema for now.