require 'uri' require 'net/https' require 'erb' include ERB::Util require 'ostruct' require 'rubygems' require 'hpricot' require 'breakpoint' # ######################################## # NOTE: set details at bottom of this file # ######################################## class Webmin def initialize( host, user, password ) @host = host @user = user @pass = password @url = URI.parse 'https://'+host @http = Net::HTTP.new(@url.host, @url.port) @http.use_ssl = true if @url.scheme == "https" # enable SSL/TLS @debug = false end def login postdata = "page=%2F&user=#{url_encode(@user)}&pass=#{url_encode(@pass)}" resp, data = post( '/session_login.cgi', postdata, 'Cookie' => 'testing=1' ) @cookie = resp.header['set-cookie'] debug "Setting cookie: "+@cookie end def list_databases dbs = [] resp, data = get '/virtual-server/list_databases.cgi?dom=11517040562573' debug '*********************' debug data doc = Hpricot(data) (doc/:a).each do |a| href = a.attributes['href'] name = a.inner_html if href.match /^edit_database\.cgi\?dom=(.+)&name=(.+)&type=(.+)$/ dbs << OpenStruct.new( { :id => $1, :name => $2, :type => $3 } ) end end return dbs end def delete_database( domain_id, name, dbtype ) postdata = "dom=#{domain_id}&name=#{url_encode(name)}&type=#{url_encode(dbtype)}&delete=Delete+This+Database&confirm=Delete+Now" resp, data = post( '/virtual-server/save_database.cgi', postdata ) end def create_database( domain_id, name, dbtype ) postdata = "dom=#{domain_id}&new=1&name=#{url_encode(name)}&type=#{url_encode(dbtype)}&&create=Create" resp, data = post( '/virtual-server/save_database.cgi', postdata ) end private def get( path, extra_headers={} ) headers = default_headers.merge( extra_headers ) debug "Getting:\n #{path}\n #{headers.inspect}" resp, data = @http.get( path, headers ) debug "\nResponse:\n "+resp.inspect debug "\nResponse data:\n"+data return resp, data end def post( path, postdata, extra_headers={} ) extra_headers['Content-length'] = postdata.length.to_s headers = default_headers.merge( extra_headers ) debug "\n#############\n###############\nPosting:\n #{path}\n #{headers.inspect}\n #{postdata}" resp, data = @http.post( path, postdata, headers ) debug "\nResponse:\n "+resp.inspect debug "\nResponse data:\n"+data return resp, data end def default_headers h = { 'Host' => @host, 'User-Agent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1', 'Content-type' => 'application/x-www-form-urlencoded', 'Referer' => 'https://webmin.georgia.textdrive.com/' } h['Cookie'] = @cookie if @cookie return h end def debug( msg ) puts msg if @debug end end def get_password require 'termios' # Save current buffering mode buffering = $stdout.sync # Turn off buffering $stdout.sync = true begin # stop echo term = Termios::getattr( $stdin ) term.c_lflag &= ~Termios::ECHO term.c_lflag &= ~Termios::ICANON Termios::setattr( $stdin, Termios::TCSANOW, term ) print "Enter password for #{USER} at #{HOST}: " password = "" while ( char = $stdin.getc ) != 10 # 0A putc '*' password << char end ensure # restore echo term = Termios::getattr( $stdin ) term.c_lflag |= ( Termios::ECHO | Termios::ICANON ) Termios::setattr( $stdin, Termios::TCSANOW, term ) print "\n" end # Restore original buffering mode $stdout.sync = buffering return password end HOST = 'webmin.georgia.textdrive.com' USER = 'dav' PASSWORD = get_password # you can get the domain id from the URL bar when you log in to webmin # and edit your virtual server. It will be something like # https://webmin.georgia.textdrive.com/virtual-server/edit_domain.cgi?dom=123412341234 DOMAIN_ID = '123412341234' DB_TYPE = 'postgres' DB_NAME = 'demo' webmin = Webmin.new HOST, USER, PASSWORD webmin.login webmin.delete_database DOMAIN_ID, DB_NAME, DB_TYPE webmin.create_database DOMAIN_ID, DB_NAME, DB_TYPE