diff --git a/bin/dat b/bin/dat index b6fd0fb..274d5fa 100755 --- a/bin/dat +++ b/bin/dat @@ -56,6 +56,10 @@ when :make puts "making..." require 'make' Make.command(options) +when :execute + puts "Ececuting: #{options.name}" + require 'execute' + Execute.file(options) when :goto Dir.chdir(ENV["DAT_ROOT"]) when :vm diff --git a/doc/execute.md b/doc/execute.md new file mode 100644 index 0000000..efa8ace --- /dev/null +++ b/doc/execute.md @@ -0,0 +1,37 @@ + + +It is how you can describe config of your server + + + +```ruby +user :artur +user :lucyna + +service :forgejo do |context| + context.home_page = true + # per default all users are allowed + context.users = [:artur] +end + +service :zulip + +# this should be already installed, becouse it is required by others +service :postgresql + +install :nvim, :python +``` + + +And then save it as `Configfile` as default or with specyfic name + + +```bash +# if default file name +dat execute + +# if non standard file +dat execute file-name + +``` + diff --git a/lib/execute.rb b/lib/execute.rb new file mode 100644 index 0000000..d91d6ef --- /dev/null +++ b/lib/execute.rb @@ -0,0 +1,71 @@ + +module Execute + + +end + + +require 'rubygems' +require 'ostruct' + +# dat execute progress +# dat execute < default Configfile + +module Execute + def dependency(name) + puts "Checking for #{name}..." + + unless gem_installed?(name) + puts "Installing #{name}..." + system("gem install #{name}") + else + puts "#{name} is already installed." + end + + require name + rescue LoadError => e + puts "Failed to load #{name}: #{e.message}" + end + + def gem_installed?(name) + Gem::Specification::find_all_by_name(name).any? + end + + def postgres + require 'setup/postgresql' + puts 'installing postgres' + Setup::PostgreSQL.install + end + + def service(name) + if block_given? + context = OpenStruct.new + output = yield context + puts output + puts "context: #{context}" + else + puts "No block provided" + end + end + + def user(name) + puts "Creating user: #{name}" + end + + def install(*packages) + packages.each do |pkg| + puts "Installing #{pkg}" + end + end + + def self.file(options) + puts "options: #{options}" + dsl = Object.new + dsl.extend(Execute) + # Configfile + path = File.join(Dir.pwd, options.name || "./Configfile") + dsl.instance_eval(File.read(path), path) + # Execute the config + end +end +