2014-05-02 05:21:46 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package cmd
import (
2014-05-05 21:08:01 +04:00
"fmt"
2014-05-02 05:21:46 +04:00
"log"
"os"
"path"
2014-05-05 21:08:01 +04:00
"time"
2014-05-02 05:21:46 +04:00
"github.com/Unknwon/cae/zip"
"github.com/codegangsta/cli"
2014-05-05 08:55:17 +04:00
"github.com/gogits/gogs/models"
2014-05-26 04:11:25 +04:00
"github.com/gogits/gogs/modules/setting"
2014-05-02 05:21:46 +04:00
)
var CmdDump = cli . Command {
Name : "dump" ,
2014-05-05 08:55:17 +04:00
Usage : "Dump Gogs files and database" ,
Description : ` Dump compresses all related files and database into zip file .
It can be used for backup and capture Gogs server image to send to maintainer ` ,
2014-05-02 05:21:46 +04:00
Action : runDump ,
2014-09-08 03:39:26 +04:00
Flags : [ ] cli . Flag {
2015-02-09 05:26:14 +03:00
cli . StringFlag { "config, c" , "custom/conf/app.ini" , "Custom configuration file path" , "" } ,
2014-09-08 03:39:26 +04:00
cli . BoolFlag { "verbose, v" , "show process details" , "" } ,
} ,
2014-05-02 05:21:46 +04:00
}
2014-09-08 03:39:26 +04:00
func runDump ( ctx * cli . Context ) {
2015-02-05 13:12:37 +03:00
if ctx . IsSet ( "config" ) {
setting . CustomConf = ctx . String ( "config" )
}
2015-09-17 06:08:46 +03:00
setting . NewContext ( )
models . LoadConfigs ( )
2014-05-05 08:55:17 +04:00
models . SetEngine ( )
2014-05-02 05:21:46 +04:00
2014-05-26 04:11:25 +04:00
log . Printf ( "Dumping local repositories...%s" , setting . RepoRootPath )
2014-09-08 03:39:26 +04:00
zip . Verbose = ctx . Bool ( "verbose" )
2014-05-02 05:21:46 +04:00
defer os . Remove ( "gogs-repo.zip" )
2014-05-26 04:11:25 +04:00
if err := zip . PackTo ( setting . RepoRootPath , "gogs-repo.zip" , true ) ; err != nil {
2014-05-02 05:21:46 +04:00
log . Fatalf ( "Fail to dump local repositories: %v" , err )
}
2014-05-05 08:55:17 +04:00
log . Printf ( "Dumping database..." )
defer os . Remove ( "gogs-db.sql" )
if err := models . DumpDatabase ( "gogs-db.sql" ) ; err != nil {
log . Fatalf ( "Fail to dump database: %v" , err )
}
2014-05-05 21:08:01 +04:00
fileName := fmt . Sprintf ( "gogs-dump-%d.zip" , time . Now ( ) . Unix ( ) )
2014-05-05 08:55:17 +04:00
log . Printf ( "Packing dump files..." )
2014-05-05 21:08:01 +04:00
z , err := zip . Create ( fileName )
2014-05-02 05:21:46 +04:00
if err != nil {
2014-05-05 21:08:01 +04:00
os . Remove ( fileName )
log . Fatalf ( "Fail to create %s: %v" , fileName , err )
2014-05-02 05:21:46 +04:00
}
2014-05-26 04:11:25 +04:00
workDir , _ := setting . WorkDir ( )
z . AddFile ( "gogs-repo.zip" , path . Join ( workDir , "gogs-repo.zip" ) )
z . AddFile ( "gogs-db.sql" , path . Join ( workDir , "gogs-db.sql" ) )
2014-11-24 05:58:39 +03:00
z . AddDir ( "custom" , path . Join ( workDir , "custom" ) )
2014-05-26 04:11:25 +04:00
z . AddDir ( "log" , path . Join ( workDir , "log" ) )
2014-10-11 05:40:51 +04:00
// FIXME: SSH key file.
2014-05-05 08:55:17 +04:00
if err = z . Close ( ) ; err != nil {
2014-05-05 21:08:01 +04:00
os . Remove ( fileName )
log . Fatalf ( "Fail to save %s: %v" , fileName , err )
2014-05-05 08:55:17 +04:00
}
2014-05-02 05:21:46 +04:00
log . Println ( "Finish dumping!" )
}