| 
1 | 1 | package logn  | 
2 | 2 | 
 
  | 
3 | 3 | import (  | 
 | 4 | +	"archive/zip"  | 
 | 5 | +	"errors"  | 
4 | 6 | 	"fmt"  | 
 | 7 | +	"io/ioutil"  | 
5 | 8 | 	"log"  | 
6 | 9 | 	"net/http"  | 
7 | 10 | 	"net/url"  | 
8 | 11 | 	"os"  | 
9 | 12 | 	"runtime"  | 
 | 13 | +	"strconv"  | 
10 | 14 | 	"strings"  | 
11 | 15 | 	"time"  | 
12 | 16 | )  | 
@@ -135,6 +139,9 @@ func makeLog(typeLogs int, title string, logMessage interface{}, loc string) err  | 
135 | 139 | 	if typeLog != "info" && isSendTg == "true" {  | 
136 | 140 | 		sendTg(url.QueryEscape(logMessageTg))  | 
137 | 141 | 	}  | 
 | 142 | + | 
 | 143 | +	makeZip()  | 
 | 144 | + | 
138 | 145 | 	return nil  | 
139 | 146 | }  | 
140 | 147 | 
 
  | 
@@ -204,3 +211,158 @@ func filePath(original string) string {  | 
204 | 211 | 		return original[i+1:]  | 
205 | 212 | 	}  | 
206 | 213 | }  | 
 | 214 | + | 
 | 215 | +// CronZip used for cron zipped log  | 
 | 216 | +func CronZip() error {  | 
 | 217 | +	if len(os.Args) == 2 {  | 
 | 218 | +		if os.Args[1] == "logn_zip_run" {  | 
 | 219 | +			err := makeZip()  | 
 | 220 | +			if err != nil {  | 
 | 221 | +				return err  | 
 | 222 | +			}  | 
 | 223 | +		}  | 
 | 224 | +	}  | 
 | 225 | + | 
 | 226 | +	return nil  | 
 | 227 | +}  | 
 | 228 | + | 
 | 229 | +func makeZip() error {  | 
 | 230 | +	var dirZip, isZipped, dir string  | 
 | 231 | + | 
 | 232 | +	if len(os.Getenv("logn_dir")) != 0 {  | 
 | 233 | +		dir = os.Getenv("logn_dir")  | 
 | 234 | +	} else {  | 
 | 235 | +		dir = "log/"  | 
 | 236 | +	}  | 
 | 237 | + | 
 | 238 | +	if len(os.Getenv("logn_dir_zip")) != 0 {  | 
 | 239 | +		dirZip = os.Getenv("logn_dir_zip")  | 
 | 240 | +	} else {  | 
 | 241 | +		dirZip = "log_zip/"  | 
 | 242 | +	}  | 
 | 243 | + | 
 | 244 | +	if len(os.Getenv("is_zipped")) != 0 {  | 
 | 245 | +		isZipped = os.Getenv("is_zipped")  | 
 | 246 | +	} else {  | 
 | 247 | +		isZipped = "false"  | 
 | 248 | +	}  | 
 | 249 | + | 
 | 250 | +	year, err := timeNow("Y")  | 
 | 251 | +	if err != nil {  | 
 | 252 | +		return err  | 
 | 253 | +	}  | 
 | 254 | + | 
 | 255 | +	month, err := timeNow("M")  | 
 | 256 | +	if err != nil {  | 
 | 257 | +		return err  | 
 | 258 | +	}  | 
 | 259 | + | 
 | 260 | +	day, err := timeNow("D")  | 
 | 261 | +	if err != nil {  | 
 | 262 | +		return err  | 
 | 263 | +	}  | 
 | 264 | + | 
 | 265 | +	if day == "01" && isZipped == "true" {  | 
 | 266 | + | 
 | 267 | +		monthInt, err := strconv.Atoi(month)  | 
 | 268 | +		if err != nil {  | 
 | 269 | +			return err  | 
 | 270 | +		}  | 
 | 271 | + | 
 | 272 | +		prevMonth := monthInt - 1  | 
 | 273 | + | 
 | 274 | +		if month == "01" {  | 
 | 275 | +			prevMonth = 12  | 
 | 276 | + | 
 | 277 | +			yearInt, err := strconv.Atoi(year)  | 
 | 278 | +			if err != nil {  | 
 | 279 | +				return err  | 
 | 280 | +			}  | 
 | 281 | + | 
 | 282 | +			prevYear := yearInt - 1  | 
 | 283 | + | 
 | 284 | +			year = strconv.Itoa(prevYear)  | 
 | 285 | +		}  | 
 | 286 | + | 
 | 287 | +		dirFile := dirZip + year  | 
 | 288 | + | 
 | 289 | +		_, errYear := os.Stat(dirFile)  | 
 | 290 | +		if os.IsNotExist(errYear) {  | 
 | 291 | +			errDir := os.MkdirAll(dirFile, 0755)  | 
 | 292 | +			if errDir != nil {  | 
 | 293 | +				return errDir  | 
 | 294 | +			}  | 
 | 295 | +		}  | 
 | 296 | + | 
 | 297 | +		filename := fmt.Sprintf("log_%s_%s.zip", year, strconv.Itoa(prevMonth))  | 
 | 298 | + | 
 | 299 | +		baseDir := dir + year + "/" + strconv.Itoa(prevMonth) + "/"  | 
 | 300 | +		_, errYear = os.Stat(baseDir)  | 
 | 301 | +		if os.IsNotExist(errYear) {  | 
 | 302 | +			return errors.New("base dir doesn't exists")  | 
 | 303 | +		}  | 
 | 304 | + | 
 | 305 | +		outDir := dirFile + "/" + filename  | 
 | 306 | + | 
 | 307 | +		err = zipWriter(baseDir, outDir)  | 
 | 308 | +		if err != nil {  | 
 | 309 | +			fmt.Println(err.Error())  | 
 | 310 | +		}  | 
 | 311 | +	}  | 
 | 312 | + | 
 | 313 | +	return nil  | 
 | 314 | +}  | 
 | 315 | + | 
 | 316 | +func zipWriter(baseDir, outDir string) error {  | 
 | 317 | +	outFile, err := os.Create(outDir)  | 
 | 318 | +	if err != nil {  | 
 | 319 | +		return err  | 
 | 320 | +	}  | 
 | 321 | +	defer outFile.Close()  | 
 | 322 | + | 
 | 323 | +	w := zip.NewWriter(outFile)  | 
 | 324 | + | 
 | 325 | +	err = addFiles(w, baseDir, "")  | 
 | 326 | +	if err != nil {  | 
 | 327 | +		return err  | 
 | 328 | +	}  | 
 | 329 | + | 
 | 330 | +	err = w.Close()  | 
 | 331 | +	if err != nil {  | 
 | 332 | +		return err  | 
 | 333 | +	}  | 
 | 334 | + | 
 | 335 | +	return nil  | 
 | 336 | +}  | 
 | 337 | + | 
 | 338 | +func addFiles(w *zip.Writer, basePath, baseInZip string) error {  | 
 | 339 | +	files, err := ioutil.ReadDir(basePath)  | 
 | 340 | +	if err != nil {  | 
 | 341 | +		return err  | 
 | 342 | +	}  | 
 | 343 | + | 
 | 344 | +	for _, file := range files {  | 
 | 345 | +		fmt.Println(basePath + file.Name())  | 
 | 346 | +		if !file.IsDir() {  | 
 | 347 | +			dat, err := ioutil.ReadFile(basePath + file.Name())  | 
 | 348 | +			if err != nil {  | 
 | 349 | +				return err  | 
 | 350 | +			}  | 
 | 351 | + | 
 | 352 | +			f, err := w.Create(baseInZip + file.Name())  | 
 | 353 | +			if err != nil {  | 
 | 354 | +				return err  | 
 | 355 | +			}  | 
 | 356 | +			_, err = f.Write(dat)  | 
 | 357 | +			if err != nil {  | 
 | 358 | +				return err  | 
 | 359 | +			}  | 
 | 360 | +		} else if file.IsDir() {  | 
 | 361 | +			newBase := basePath + file.Name() + "/"  | 
 | 362 | + | 
 | 363 | +			addFiles(w, newBase, baseInZip+file.Name()+"/")  | 
 | 364 | +		}  | 
 | 365 | +	}  | 
 | 366 | + | 
 | 367 | +	return nil  | 
 | 368 | +}  | 
0 commit comments