yum repo maint script changes
[nodejs-repoproxy.git] / lib / repo-yum.js
1 var fs = require("fs");
2 var http = require("http");
3 var url = require("url");
4 var path = require("path");
5 var cache = require("./cache.js");
6 var log = require("./log.js");
7
8
9
10 function maintain(name, repoinfo, files) {
11         log.info("Starting maintenance routine for yum repo %s (%s)", name, repoinfo.url);
12         
13         var metaAge = 24*3600*1000*(repoinfo.updateinterval);
14         var expireAge = 24*3600*1000*(repoinfo.expiretime);
15         
16         
17         function fileCheck(i) {
18                 var wasExpired = false;
19                 var inDownload = false;
20                 var disappeared = false;
21                 
22                 log.debug("checking file: ", files[i]);
23                 log.debug("checking if file is in download mode");
24
25                 // need to check global.repoproxy.downloads
26                 if(typeof global.repoproxy.downloads[files[i]] != "undefined") {
27                         if(global.repoproxy.downloads[files[i]] == 1) {
28                                 inDownload=true;
29                         }
30                 }
31                 
32                 
33                 
34                 // we look for repodata/repomd.xml file, if this is past maturity, we clean that whole directory
35                 if(!inDownload) {
36                         
37                         var metafile = files[i].replace(/(.*)\/(.[^\/]+$)/, "$1/.meta.$2.filesize");
38
39                         if(files[i].match(/.*repodata\/repomd\.xml$/)) {
40                                 log.debug("Found repomd.xml file: ", files[i]);
41                                 
42                                 // strip the repomd file to get the dir
43                                 var repomddir = files[i].replace(/repomd\.xml$/, "");
44                                 log.debug("repomd dir is:", repomddir);
45         
46                                 
47                                 // do the file stat
48                                 fs.stat(files[i], function(err, stats) {
49                                         log.debug("stats for file was: ", stats);
50                                         var curtime = new Date().getTime();
51                                         var ctime = stats.ctime.getTime();
52                                         log.debug("curtime is ", curtime);
53                                         log.debug("ctime is ", ctime);
54                                         
55                                         var age = curtime - ctime;
56                                         log.debug("age is (%d) for (%d)", age, metaAge);
57                                         if(age > metaAge) {
58                                                 cache.moveToCleanup(repomddir);
59                                                 log.info("Sending repomd directory to trash for cleanup (%s)", repomddir);
60                                                 wasExpired = true;
61                                         }
62                                 })
63                                 
64                         } else {
65                                 // STUFF!!!
66                                 fs.stat(files[i], function(err, stats) {
67                                         if(err) {
68                                                 log.debug("some weird problem stating the file");
69                                                 disappeared = true;
70                                         } else {
71                                                 log.debug("stats for file was: ", stats);
72                                                 var curtime = new Date().getTime();
73                                                 var atime = stats.atime.getTime();
74                                                 log.debug("curtime is ", curtime);
75                                                 log.debug("ctime is ", atime);
76                                                 
77                                                 var age = curtime - atime;
78                                                 //log.debug("age is (%d) for (%d)", age, expireAge);
79                                                 if(age > expireAge) {
80                                                         // TODO: cleanup singular file
81                                                         // TODO: cleanup meta too, fuck me
82                                                         //log.debug("clean up file \n", files[i]);
83                                                         //log.debug("meta for this file is \n", nfile);
84                                                         cache.moveToCleanup(files[i]);
85                                                         cache.moveToCleanup(metafile);
86                                                         log.info("Sending expired file to trash for cleanup (%s)", files[i]);
87                                                         wasExpired = true;
88                                                 }
89                                         }
90                                 })
91                         }
92                         
93                         
94                         // make sure we have a metadata file for our file
95                         if(!disappeared) {
96                                 fs.stat(metafile, function(err, stats) {
97                                         if(err) {
98                                                 log.debug("file (%s) has no metadata file - moving for cleanup");
99                                                 cache.moveToCleanup(files[i]);
100                                                 cache.moveToCleanup(metafile);
101                                         } else {
102                                                 
103                                                 // check meta data
104                                                 fs.stat(files[i], function(err, stats) {
105                                                         var fsize = stats.size;
106                                                         var mfile = fs.createReadStream(metafile);
107                                                         var expSize = "";
108                                                         mfile.on("data", function(data) {
109                                                                 expSize += data;
110                                                         });
111                                                         
112                                                         mfile.on("end", function(closed) {
113                                                                 if(fsize != parseInt(expSize)) {
114                                                                         log.debug("possible metadata clash for (%s) - (%d),(%s), removing file", files[i], fsize, expSize);
115                                                                         cache.moveToCleanup(files[i]);
116                                                                         cache.moveToCleanup(metafile);
117                                                                 } else {
118                                                                         log.debug("metadata good for (%s) - (%d),(%s)", files[i], fsize, expSize);
119                                                                 }
120                                                         });
121         
122                                                 });
123                                         }
124                                 });
125                         }
126                         
127                 } else {
128                         log.debug("file %s was ignored as its in download", files[i]);
129                 }
130
131                 if(typeof files[i+1] != "undefined") fileCheck(i+1);
132         }
133         
134         if(typeof files[0] != 'undefined') fileCheck(0)
135         else log.info("Skipping (yum) file check as there are none... apprently?");
136
137 }
138
139 exports.maintain = maintain;