running git server with "smart http" protocol

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

running git server with "smart http" protocol

Kent Watsen
TL;DR;  The current issue is this error:

        error: cannot run upload-pack: No such file or directory


Steps:

1) OpenBSD 6.5 fresh install

2) pkg_add git

3) make /var/www/dev/null

       # mkdir dev
       # mknod dev/null c 2 2
       # chmod 666 dev/null

4) put `git-http-backend` into jail

       # for f in `ldd /usr/local/libexec/git/git-http-backend | grep '/usr/' | grep -v ':' | awk '{print $7}'`; do
             d=`dirname $f | sed 's#^/##'`
             mkdir -p $d
             cp $f $d
          done

5) put `git-upload-pack` into jail

       # for f in `ldd /usr/local/libexec/git/git-upload-pack  | grep '/usr/' | grep -v ':' | awk '{print $7}'`; do
             d=`dirname $f | sed 's#^/##'`
             mkdir -p $d
             cp $f $d
          done

6) set /etc/httpd.conf

      server "default" {
          listen on 0.0.0.0 port 80

          # these two rules are trying to match https://git-scm.com/docs/git-http-backend <https://git-scm.com/docs/git-http-backend>,
          # but I suspect that I botched them...
          location match "^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$" {
            request rewrite "/usr/local/libexec/git/git-http-backend/%1"
          }
          location match "^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$" {
            request rewrite "/usr/local/libexec/git/git-http-backend/%1"
          }

          location "/docs/*" {
              fastcgi {
                  socket "/run/slowcgi.sock"
                  param DOCUMENT_ROOT "/"
                  param GIT_HTTP_EXPORT_ALL ""
                  param GIT_PROJECT_ROOT "/git-repos"
                  param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
              }
          }
      }

7) create "docs" repo:

      # mkdir git-repos
      # git init --bare git-repos/docs
      # cd git-repos/docs/; git update-server-info; cd -

8) In one window:

      # httpd -d -vv

9) In another window:

      # slowcgi -d

10) In a 3rd window:

      # git clone http://127.0.0.1/docs <http://127.0.0.1/docs>
      Cloning into 'docs'...
      fatal: Could not read from remote repository.

      Please make sure you have the correct access rights
      and the repository exists.

11) Observe output in the `httpd` window:

      error: cannot run upload-pack: No such file or directory

      default 127.0.0.1 - - [17/Jan/2020:11:36:35 -0500] "GET /docs/info/refs?service=git-upload-pack HTTP/1.1" 200 0
      server default, client 1 (1 active), 127.0.0.1:47830 -> 127.0.0.1, closed

    Notables here:

        # ls -l git-repos/docs/info/refs                                                                                                                                                                                    
        -rw-r--r--  1 root  daemon  0 Jan 17 11:50 git-repos/docs/info/refs

        # file git-repos/docs/info/refs  
        git-repos/docs/info/refs: empty

        (but, from experience, I know that this is a text file, not something that might take an HTTP query parameter)

12) Observe output in the `slowcgi` window:

      slowcgi: inflight incremented, now 1                                                                        
      slowcgi: version:         1                                                                                  
      slowcgi: type:            1                                                                                  
      slowcgi: requestId:       1                  
      slowcgi: contentLength:   8      
      slowcgi: paddingLength:   0                                                                                                                                                                                      
      slowcgi: reserved:        0
      slowcgi: role             1
      slowcgi: flags            0
      slowcgi: version:         1
      slowcgi: type:            4
      slowcgi: requestId:       1
      slowcgi: contentLength:   729
      slowcgi: paddingLength:   0                                                                                                                                                                                      
      slowcgi: reserved:        0
      slowcgi: env[0], PATH_INFO=/docs/info/refs
      slowcgi: env[1], SCRIPT_NAME=
      slowcgi: env[2], SCRIPT_FILENAME=/
      slowcgi: env[3], QUERY_STRING=service=git-upload-pack
      slowcgi: env[4], DOCUMENT_ROOT=/htdocs
      slowcgi: env[5], DOCUMENT_URI=/docs/info/refs
      slowcgi: env[6], GATEWAY_INTERFACE=CGI/1.1                                                                                                                                                                      
      slowcgi: env[7], HTTP_ACCEPT=*/*
      slowcgi: env[8], HTTP_ACCEPT_ENCODING=deflate, gzip
      slowcgi: env[9], HTTP_HOST=127.0.0.1
      slowcgi: env[10], HTTP_PRAGMA=no-cache
      slowcgi: env[11], HTTP_USER_AGENT=git/2.21.0
      slowcgi: env[12], GIT_PROJECT_ROOT=/git-repos
      slowcgi: env[13], GIT_HTTP_EXPORT_ALL=
      slowcgi: env[14], SCRIPT_FILENAME=/usr/local/libexec/git/git-http-backend                                                                                                                                        
      slowcgi: env[15], GIT_PROJECT_ROOT=/git-repos
      slowcgi: env[16], GIT_HTTP_EXPORT_ALL=
      slowcgi: env[17], SCRIPT_FILENAME=/usr/local/libexec/git/git-http-backend
      slowcgi: env[18], REMOTE_ADDR=127.0.0.1
      slowcgi: env[19], REMOTE_PORT=47830
      slowcgi: env[20], REQUEST_METHOD=GET
      slowcgi: env[21], REQUEST_URI=/docs/info/refs?service=git-upload-pack
      slowcgi: env[22], SERVER_ADDR=127.0.0.1                                                                                                                                                                          
      slowcgi: env[23], SERVER_PORT=80
      slowcgi: env[24], SERVER_NAME=default
      slowcgi: env[25], SERVER_PROTOCOL=HTTP/1.1
      slowcgi: env[26], SERVER_SOFTWARE=OpenBSD httpd
      slowcgi: version:         1
      slowcgi: type:            4
      slowcgi: requestId:       1
      slowcgi: contentLength:   0                                                                                                                                                                                      
      slowcgi: paddingLength:   0
      slowcgi: reserved:        0
      slowcgi: fork: /usr/local/libexec/git/git-http-backend
      slowcgi: version:         1
      slowcgi: type:            5
      slowcgi: requestId:       1
      slowcgi: contentLength:   0
      slowcgi: paddingLength:   0                                                                                                                                                                                      
      slowcgi: reserved:        0
      slowcgi: resp version:         1
      slowcgi: resp type:            6
      slowcgi: resp requestId:       1
      slowcgi: resp contentLength:   172
      slowcgi: resp paddingLength:   4
      slowcgi: resp reserved:        0
      slowcgi: wait: /usr/local/libexec/git/git-http-backend                                                                                                                                                          
      slowcgi: resp version:         1
      slowcgi: resp type:            6
      slowcgi: resp requestId:       1
      slowcgi: resp contentLength:   34
      slowcgi: resp paddingLength:   6
      slowcgi: resp reserved:        0
      slowcgi: resp version:         1
      slowcgi: resp type:            7                                                                                                                                                                                
      slowcgi: resp requestId:       1
      slowcgi: resp contentLength:   57
      slowcgi: resp paddingLength:   7
      slowcgi: resp reserved:        0
      slowcgi: resp version:         1
      slowcgi: resp type:            6
      slowcgi: resp requestId:       1
      slowcgi: resp contentLength:   0                                                                                                                                                                                
      slowcgi: resp paddingLength:   0
      slowcgi: resp reserved:        0
      slowcgi: resp version:         1
      slowcgi: resp type:            7
      slowcgi: resp requestId:       1
      slowcgi: resp contentLength:   0
      slowcgi: resp paddingLength:   0
      slowcgi: resp reserved:        0                                                                                                                                                                                  
      slowcgi: resp version:         1
      slowcgi: resp type:            3
      slowcgi: resp requestId:       1
      slowcgi: resp contentLength:   8
      slowcgi: resp paddingLength:   0
      slowcgi: resp reserved:        0
      slowcgi: resp appStatus:       1
      slowcgi: resp protocolStatus:  0



Thanks in advance!

Kent



Reply | Threaded
Open this post in threaded view
|

Re: running git server with "smart http" protocol

Kent Watsen

Regarding the rewrite rules below, `man git-http-backend` is instructive
...though it would be better if updated for OpenBSD's native `httpd`  ;)

K.


> 6) set /etc/httpd.conf
>
>      server "default" {
>          listen on 0.0.0.0 port 80
>
>          # these two rules are trying to match https://git-scm.com/docs/git-http-backend <https://git-scm.com/docs/git-http-backend>,
>          # but I suspect that I botched them...
>          location match "^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$" {
>            request rewrite "/usr/local/libexec/git/git-http-backend/%1"
>          }
>          location match "^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$" {
>            request rewrite "/usr/local/libexec/git/git-http-backend/%1"
>          }
>
>          location "/docs/*" {
>              fastcgi {
>                  socket "/run/slowcgi.sock"
>                  param DOCUMENT_ROOT "/"
>                  param GIT_HTTP_EXPORT_ALL ""
>                  param GIT_PROJECT_ROOT "/git-repos"
>                  param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
>              }
>          }
>      }

Reply | Threaded
Open this post in threaded view
|

Re: running git server with "smart http" protocol

Kent Watsen

For posterity, the issue was that the `git` command itself needs to be in the jail also.  This is not written down anywhere.  I only determined it after reading the source code for `git-http-backend`.

This is my init script now:

        # cd /var/www
        # for c in git git-http-backend git-upload-pack git-receive-pack ; do
                for f in `ldd /usr/local/libexec/git/$c  | grep '/usr/' | grep -v ':' | awk '{print $7}'`; do
                        d=`dirname $f | sed 's#^/##'`
                        mkdir -p $d
                        cp $f $d
                done
        done

Also, regarding the rewrite rules mentioned before, they are only needed if wanting to discriminate between `git` and web requests pointing to the same URL.

Kent