]> Git repositories of Nishi - koakuma.git/commitdiff
rpc works
authorNishi <nishi@nishi.boats>
Tue, 1 Oct 2024 18:07:27 +0000 (18:07 +0000)
committerNishi <nishi@nishi.boats>
Tue, 1 Oct 2024 18:07:27 +0000 (18:07 +0000)
git-svn-id: file:///raid/svn-personal/koakuma/trunk@5 219d0f9c-2d94-d447-890a-813e76b88fe9

Tool/create-project.in
Utility/rpc.tcl
koakuma.cgi.in

index 76aae3ee72710aa2694533972a5d4f06c8064b90..76d5d3a6b53b13e43568189c54ba4dd8f34a7624 100644 (file)
@@ -1,5 +1,6 @@
 #!/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] == "-" } {
@@ -17,6 +18,7 @@ foreach path [glob "@@PREFIX@@/lib/koakuma/utility/*.tcl"] {
 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 } {
@@ -31,4 +33,37 @@ 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)"]"
+}
index 609782fdd6ba6db91c20dcfec4537a21a94a9080..16fa0fc955b59adc5bbe34a7e020b260c6bb27cf 100644 (file)
@@ -20,21 +20,21 @@ namespace eval rpc {
        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]
@@ -46,4 +46,19 @@ namespace eval rpc {
                }
                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
+       }
 }
index 9a7aeb681b49f924e864bf77bc0fb2ad60c482af..870d273473531d62e19eefd97944a15fec57a209 100644 (file)
@@ -54,6 +54,7 @@ if { [catch {
        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"
@@ -67,6 +68,16 @@ if { [catch {
        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 ""
@@ -265,14 +276,59 @@ if { [catch {
                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"] } {