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
2015-11-28 16:07:51 +03:00
"io/ioutil"
2014-05-02 05:21:46 +04:00
"github.com/Unknwon/cae/zip"
2016-08-30 14:57:58 +03:00
"github.com/urfave/cli"
2014-05-02 05:21:46 +04:00
2016-11-03 15:29:56 +03:00
"github.com/go-gitea/gitea/models"
"github.com/go-gitea/gitea/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-11-16 01:07:44 +03:00
stringFlag ( "config, c" , "custom/conf/app.ini" , "Custom configuration file path" ) ,
2016-05-24 03:10:05 +03:00
boolFlag ( "verbose, v" , "Show process details" ) ,
stringFlag ( "tempdir, t" , os . TempDir ( ) , "Temporary dir path" ) ,
2014-09-08 03:39:26 +04:00
} ,
2014-05-02 05:21:46 +04:00
}
2016-05-12 21:32:28 +03:00
func runDump ( ctx * cli . Context ) error {
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
2016-05-24 03:10:05 +03:00
tmpDir := ctx . String ( "tempdir" )
if _ , err := os . Stat ( tmpDir ) ; os . IsNotExist ( err ) {
log . Fatalf ( "Path does not exist: %s" , tmpDir )
}
TmpWorkDir , err := ioutil . TempDir ( tmpDir , "gogs-dump-" )
2015-11-28 16:07:51 +03:00
if err != nil {
log . Fatalf ( "Fail to create tmp work directory: %v" , err )
}
log . Printf ( "Creating tmp work dir: %s" , TmpWorkDir )
reposDump := path . Join ( TmpWorkDir , "gogs-repo.zip" )
dbDump := path . Join ( TmpWorkDir , "gogs-db.sql" )
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" )
2015-11-28 16:07:51 +03:00
if err := zip . PackTo ( setting . RepoRootPath , reposDump , 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..." )
2015-11-28 16:07:51 +03:00
if err := models . DumpDatabase ( dbDump ) ; err != nil {
2014-05-05 08:55:17 +04:00
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
}
2016-05-12 21:32:28 +03:00
if err := z . AddFile ( "gogs-repo.zip" , reposDump ) ; err != nil {
2015-11-28 14:11:38 +03:00
log . Fatalf ( "Fail to include gogs-repo.zip: %v" , err )
}
2016-05-12 21:32:28 +03:00
if err := z . AddFile ( "gogs-db.sql" , dbDump ) ; err != nil {
2015-11-28 14:11:38 +03:00
log . Fatalf ( "Fail to include gogs-db.sql: %v" , err )
}
2015-11-28 17:08:50 +03:00
customDir , err := os . Stat ( setting . CustomPath )
if err == nil && customDir . IsDir ( ) {
2016-05-12 21:32:28 +03:00
if err := z . AddDir ( "custom" , setting . CustomPath ) ; err != nil {
2015-11-28 17:08:50 +03:00
log . Fatalf ( "Fail to include custom: %v" , err )
2016-05-12 21:32:28 +03:00
}
2015-11-28 17:08:50 +03:00
} else {
log . Printf ( "Custom dir %s doesn't exist, skipped" , setting . CustomPath )
2015-11-28 14:11:38 +03:00
}
2016-05-12 21:32:28 +03:00
if err := z . AddDir ( "log" , setting . LogRootPath ) ; err != nil {
2015-11-28 14:11:38 +03:00
log . Fatalf ( "Fail to include log: %v" , err )
}
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
2016-08-17 21:38:42 +03:00
if err := os . Chmod ( fileName , 0600 ) ; err != nil {
log . Printf ( "Can't change file access permissions mask to 0600: %v" , err )
}
2015-11-28 16:07:51 +03:00
log . Printf ( "Removing tmp work dir: %s" , TmpWorkDir )
os . RemoveAll ( TmpWorkDir )
2015-11-28 17:22:10 +03:00
log . Printf ( "Finish dumping in file %s" , fileName )
2016-05-12 21:32:28 +03:00
return nil
2014-05-02 05:21:46 +04:00
}