#!/usr/bin/env tclsh
# $Id$
+package require tdom
set RPC_URL "http://127.0.0.1/koakuma/rpc"
foreach arg $argv {
if { [string range "$arg" 0 0] == "-" } {
if { [info exists "env(KOAKUMA_RPC)"] } {
set RPC_URL "$env(KOAKUMA_RPC)"
}
+set RPC_URL "[regsub {/+$} "$RPC_URL" ""]"
puts -nonewline "Authentication: "
set status [::rpc::require-auth]
if { $status == 1 } {
} else {
puts "Not required"
}
-::rpc::send
+
+dom createNodeCmd -tagName "name" -jsonType NONE elementNode keyName
+dom createNodeCmd -tagName "description" -jsonType NONE elementNode keyDescription
+dom createNodeCmd -tagName "vcs" -jsonType NONE elementNode keyVCS
+dom createNodeCmd -tagName "url" -jsonType NONE elementNode keyURL
+
+dom createNodeCmd -jsonType STRING textNode valueString
+
+set doc [dom createDocumentNode]
+
+proc ask_for {show var} {
+ upvar 1 $var $var
+ puts -nonewline "$show: "
+ flush stdout
+ set $var "[gets stdin]"
+}
+
+ask_for "Name" name
+ask_for "Description" description
+ask_for "VCS" vcs
+ask_for "VCS URL" url
+
+$doc appendFromScript {
+ keyName {valueString "$name"}
+ keyDescription {valueString "$description"}
+ keyVCS {valueString "$vcs"}
+ keyURL {valueString "$url"}
+}
+set result [::rpc::send "/create-project" "[$doc asJSON]"]
+if { [lindex $result 0] == 200 } {
+} else {
+ set doc [dom parse -json "[lindex $result 1]"]
+ puts "Error: [$doc selectNodes "string(/error)"]"
+}
set username ""
set password ""
proc ask-auth {} {
- upvar 1 username username
- upvar 1 password password
+ global username
+ global password
puts -nonewline "Username: "
flush stdout
- set username "[gets stdin]"
+ set ::rpc::username "[gets stdin]"
puts -nonewline "Password: "
flush stdout
exec stty -echo
- set password "[gets stdin]"
+ set ::rpc::password "[gets stdin]"
exec stty echo
puts ""
set headers ""
lappend headers "Authorization"
- lappend headers "Basic [::base64::encode -wrapchar "" "$username:$password"]"
+ lappend headers "Basic [::base64::encode -wrapchar "" "$::rpc::username:$::rpc::password"]"
global RPC_URL
set tok [::http::geturl "$RPC_URL" -headers $headers]
}
return 0
}
+ proc send {path content} {
+ set headers ""
+ global RPC_URL
+ if { "$::rpc::username" != "" } {
+ lappend headers "Authorization"
+ lappend headers "Basic [::base64::encode -wrapchar "" "$::rpc::username:$::rpc::password"]"
+ }
+ set tok [::http::geturl "$RPC_URL$path" -headers $headers -type "application/json" -query "$content"]
+ set code [::http::ncode $tok]
+ set body "[::http::data $tok]"
+ ::http::cleanup $tok
+ lappend result "$code"
+ lappend result "$body"
+ return $result
+ }
}
package require tdom
dom createNodeCmd -tagName "rpc" elementNode rootXML
dom createNodeCmd -tagName "version" -jsonType NONE elementNode keyVersion
+ dom createNodeCmd -tagName "error" -jsonType NONE elementNode keyError
dom createNodeCmd -jsonType STRING textNode valueString
}] } {
crash "Failed to load tDOM"
crash "Could not load components"
}
+set data ""
+
+while { [gets stdin line] >= 0 } {
+ if { "$data" == "" } {
+ set data "$line"
+ } else {
+ set data "$data\n$line"
+ }
+}
+
set toc ""
set result ""
set content ""
rputs "$content"
end_html 1
} elseif { [regexp {^/rpc(/.*)?$} "$path"] } {
- rputs ""
regexp {^/rpc(/.*)?$} "$path" -> api
set doc [dom createDocumentNode]
- set root $doc
+ $doc appendFromScript {
+ keyVersion {valueString "$KOAKUMA_VERSION"}
+ }
if { "$api" == "" || "$api" == "/" } {
+ rputs ""
+ rputs "[$doc asJSON]"
+ } elseif { "$api" == "/create-project" } {
+ if { [catch {dom parse -json "$data" clidoc}] } {
+ rputs "Status: 400 Bad Request"
+ $doc appendFromScript {
+ keyError {valueString "Bad JSON"}
+ }
+ } else {
+ set projname "[$clidoc selectNodes "string(/name)"]"
+ set projdescription "[$clidoc selectNodes "string(/description)"]"
+ set vcs "[$clidoc selectNodes "string(/vcs)"]"
+ set url "[$clidoc selectNodes "string(/url)"]"
+ if { "$projname" == "" || "$projdescription" == "" || "$vcs" == "" || "$url" == "" } {
+ rputs "Status: 400 Bad Request"
+ $doc appendFromScript {
+ keyError {valueString "Required field missing"}
+ }
+ } else {
+ set has_vcs 0
+ loop_components {
+ upvar 1 has_vcs has_vcs
+ upvar 1 vcs vcs
+ if { "$name" == "$vcs" } {
+ set has_vcs 1
+ break
+ }
+ }
+ if { $has_vcs == 0 } {
+ rputs "Status: 400 Bad Request"
+ $doc appendFromScript {
+ keyError {valueString "Not a valid VCS"}
+ }
+ } else {
+ open_projects
+ close_projects
+ }
+ }
+ }
+ rputs ""
+ rputs "[$doc asJSON]"
+ } else {
$root appendFromScript {
- keyVersion {valueString "$KOAKUMA_VERSION"}
+ keyError {valueString "No such endpoint"}
}
+ rputs "Status: 404 Not Found"
+ rputs ""
rputs "[$doc asJSON]"
}
} elseif { [regexp {^/project/[^/]+.*$} "$path"] } {