aboutsummaryrefslogtreecommitdiff
path: root/session.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-10-21 17:17:13 +0700
committerShulhan <ms@kilabit.info>2023-10-21 17:17:13 +0700
commit761212298e017f58345aa948aebedc2c07b73753 (patch)
tree28c556aa99678979a4162aa0e50d036d287a96ad /session.go
parent28f9ab76a83efcfcf777e571fea826e2dfc3e28e (diff)
downloadawwan-761212298e017f58345aa948aebedc2c07b73753.tar.xz
all: implement remote "#get:" and "#put:" with owner and mode
In remote environment, using magic command "#get:" or "#put:" with owner and mode like "#get:$OWNER+$MODE" or "#put:$OWNER+MODE" will changes the file owner to $USER or $GROUP and/or permission to $MODE. The file owner will not works if user does not have permission.
Diffstat (limited to 'session.go')
-rw-r--r--session.go40
1 files changed, 34 insertions, 6 deletions
diff --git a/session.go b/session.go
index a4b43b2..4cd746d 100644
--- a/session.go
+++ b/session.go
@@ -170,13 +170,29 @@ func (ses *Session) Copy(stmt *Statement) (err error) {
// Get copy file from remote to local.
func (ses *Session) Get(stmt *Statement) (err error) {
- var logp = "Get"
+ var (
+ logp = `Get`
+ src = stmt.args[0]
+ dst = stmt.args[1]
+ )
- err = ses.sshc.get(stmt.args[0], stmt.args[1])
+ err = ses.sshc.get(src, dst)
if err != nil {
return fmt.Errorf(`%s: %w`, logp, err)
}
-
+ if stmt.mode != 0 {
+ err = os.Chmod(dst, stmt.mode)
+ if err != nil {
+ return fmt.Errorf(`%s: chmod %o %q: %w`, logp, stmt.mode, dst, err)
+ }
+ }
+ if len(stmt.owner) != 0 {
+ var chownStmt = fmt.Sprintf(`chown %s %q`, stmt.owner, dst)
+ err = libexec.Run(chownStmt, nil, nil)
+ if err != nil {
+ return fmt.Errorf(`%s: %s: %w`, logp, chownStmt, err)
+ }
+ }
return nil
}
@@ -205,6 +221,18 @@ func (ses *Session) Put(stmt *Statement) (err error) {
if err != nil {
return fmt.Errorf("%s: %w", logp, err)
}
+ if stmt.mode != 0 {
+ err = ses.sshc.chmod(dst, stmt.mode)
+ if err != nil {
+ return fmt.Errorf(`%s: %w`, logp, err)
+ }
+ }
+ if len(stmt.owner) != 0 {
+ err = ses.sshc.chown(dst, stmt.owner)
+ if err != nil {
+ return fmt.Errorf(`%s: %w`, logp, err)
+ }
+ }
return nil
}
@@ -416,7 +444,7 @@ func (ses *Session) executeScriptOnLocal(req *Request, pos linePosition) (err er
return nil
}
-func (ses *Session) executeScriptOnRemote(req *Request, pos linePosition) {
+func (ses *Session) executeScriptOnRemote(req *Request, pos linePosition) (err error) {
var max = int64(len(req.script.stmts))
if pos.start > max {
return
@@ -440,7 +468,6 @@ func (ses *Session) executeScriptOnRemote(req *Request, pos linePosition) {
fmt.Fprintf(req.stdout, "\n--> %s: %3d: %s\n",
ses.sshc.conn, x, stmt.String())
- var err error
switch stmt.kind {
case statementKindDefault:
err = ses.sshc.conn.Execute(string(stmt.raw))
@@ -455,9 +482,10 @@ func (ses *Session) executeScriptOnRemote(req *Request, pos linePosition) {
}
if err != nil {
fmt.Fprintf(req.stderr, "!!! %s\n", err)
- break
+ return err
}
}
+ return nil
}
// generateFileInput read the content of file input "in", apply the session