aboutsummaryrefslogtreecommitdiffstats
path: root/iurt_cache_cleaner.sh
blob: d31e9504836b4e88f90c0359a29dfe49f283e625 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/bash
#
# Marcelo Ricardo Leitner - Properly clean Iurt cache pool - 20070615
#

# Cache topdir
TOPDIR=/export/home/iurt_cache/

# Official distros topdir
OFFICIAL_DIR=/mnt/BIG/dis/

# Maximum number of days a package is allowed to be in the cache
AGE=4

# Email to be notified about wrong uploads
MAILTO=distrib-admin@mandrivalinux.org


#
# Remove all packages generated by a given .src.rpm
#
function clean_package() {
    distro="$1"
    section="$2"
    srpm="$3"

    echo -e "Cleaning all packages generated by\n $srpm."
    find "$TOPDIR/$distro/$section" -name '*.rpm' ! -name '*.src.rpm' |\
	xargs rpm -qp --qf '%{SOURCERPM} %{name}-%{version}-%{release}.%{arch}.rpm\n' |\
	sed -n "s@^$srpm @$TOPDIR/$distro/$section/@p;" |\
	xargs rm -fv "$TOPDIR/$distro/$section/$srpm"

    find "$TOPDIR/$distro/debug_$section" -name '*.rpm' ! -name '*.src.rpm' |\
	xargs rpm -qp --qf '%{SOURCERPM} %{name}-%{version}-%{release}.%{arch}.rpm\n' |\
	sed -n "s@^$srpm @$TOPDIR/$distro/debug_$section/@p;" |\
	xargs rm -fv
}

#
# Cleans a released package
#
function clean() {
    distro="$1"
    section="$2"
    srpm="$3"

    echo "Package released. We can remove it now."
    clean_package "$distro" "$section" "$srpm"
}

#
# Cleans an aged package
#
function age_timeout() {
    distro="$1"
    section="$2"
    srpm="$3"

    echo "Package expired. We can remove it now."
    clean_package "$distro" "$section" "$srpm"
}

#
# Send a warn about packages that goes to wrong sections.
#
function wrong_section() {
    distro="$1"
    section="$2"
    srpm="$3"
    hits="$4"

    wrong_section=$(echo "$hits" | sed "s@$OFFICIAL_DIR/$distro/SRPMS/@@;s@/$srpm@@")

    echo "Package uploaded to a wrong section!"
    echo "It went to $wrong_section while should have hit $section!"
    mail -s "Package $srpm uploaded to section for $distro" $MAILTO <<_EOF_
Distro: $distro
Package: $srpm
Wanted section: $section
Final section: $wrong_section

It happened again!

I'm holding it on the cache probably for more $AGE days.
_EOF_
}

#
# Search for the .src.rpm's
#
ls "$TOPDIR" |\
while read distro; do
    find -L "$TOPDIR/$distro" -type f -name '*.src.rpm' |\
	    sed "s@$TOPDIR/$distro/@@;s@/\([^/]\+\)\$@ \1@" |\
	    while read section srpm; do
		echo
		echo "Checking $distro/$section/$srpm"

		# Check if the package was released
		if [ -e "$OFFICIAL_DIR/$distro/SRPMS/$section/$srpm" ]; then
		    clean "$distro" "$section" "$srpm"
		    continue
		fi

		# Check for age timeout
		z=$(find "$OFFICIAL_DIR/$distro/SRPMS/$section/$srpm" -ctime +$AGE -name "$srpm" 2> /dev/null)
		if [ -n "$z" ]; then
		    age_timeout "$distro" "$section" "$srpm"
		    continue
		fi

		# Check for wrong section
		z=$(find "$OFFICIAL_DIR/$distro/SRPMS" -type f -name "$srpm")
		if [ -n "$z" ]; then
		    wrong_section "$distro" "$section" "$srpm" "$z"
		    continue
		fi

		# Package should remain on cache
		echo "Package should remain on cache."
	    done
done

# Check for unsupported archs, which are uploaded without .src.rpms
echo
echo "Cleaning unsupported archs.."
find "$TOPDIR" -type f -name '*.rpm' \
	! -name '*.i586.rpm' ! -name '*.x86_64.rpm' \
	! -name '*.noarch.rpm' ! -name '*.src.rpm' |\
	xargs rm -fv
/span>gotent)); memset(&sym->pltent, 0, sizeof(sym->pltent)); return &sym->root; } int arch_load_proc_section(struct obj_section *sec, int fp) { /* Assume it's just a debugging section that we can safely ignore ... */ sec->contents = NULL; return 0; } enum obj_reloc arch_apply_relocation (struct obj_file *f, struct obj_section *targsec, struct obj_section *symsec, struct obj_symbol *sym, Elf32_Rela *rel, Elf32_Addr v) { struct s390_file *ifile = (struct s390_file *) f; struct s390_symbol *isym = (struct s390_symbol *) sym; struct s390_plt_entry *pe; Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; Elf32_Addr plt = ifile->plt ? ifile->plt->header.sh_addr : 0; enum obj_reloc ret = obj_reloc_ok; switch (ELF32_R_TYPE(rel->r_info)) { case R_390_NONE: break; case R_390_32: *(unsigned int *) loc += v; break; case R_390_16: *(unsigned short *) loc += v; break; case R_390_8: *(unsigned char *) loc += v; break; case R_390_PC32: *(unsigned int *) loc += v - dot; break; case R_390_PC16DBL: *(unsigned short *) loc += (v - dot) >> 1; break; case R_390_PC16: *(unsigned short *) loc += v - dot; break; case R_390_PLT32: case R_390_PLT16DBL: /* find the plt entry and initialize it. */ assert(isym != NULL); pe = (struct s390_plt_entry *) &isym->pltent; assert(pe->allocated); if (pe->initialized == 0) { unsigned int *ip = (unsigned int *)(ifile->plt->contents + pe->offset); ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */ ip[1] = 0x100607f1; if (ELF32_R_TYPE(rel->r_info) == R_390_PLT16DBL) ip[2] = v - 2; else ip[2] = v; pe->initialized = 1; } /* Insert relative distance to target. */ v = plt + pe->offset - dot; if (ELF32_R_TYPE(rel->r_info) == R_390_PLT32) *(unsigned int *) loc = (unsigned int) v; else if (ELF32_R_TYPE(rel->r_info) == R_390_PLT16DBL) *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1); break; case R_390_GLOB_DAT: case R_390_JMP_SLOT: *loc = v; break; case R_390_RELATIVE: *loc += f->baseaddr; break; case R_390_GOTPC: assert(got != 0); *(unsigned long *) loc += got - dot; break; case R_390_GOT12: case R_390_GOT16: case R_390_GOT32: assert(isym != NULL); assert(got != 0); if (!isym->gotent.reloc_done) { isym->gotent.reloc_done = 1; *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v; } if (ELF32_R_TYPE(rel->r_info) == R_390_GOT12) *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff; else if (ELF32_R_TYPE(rel->r_info) == R_390_GOT16) *(unsigned short *) loc += isym->gotent.offset; else if (ELF32_R_TYPE(rel->r_info) == R_390_GOT32) *(unsigned int *) loc += isym->gotent.offset; break; case R_390_GOTOFF: assert(got != 0); *loc += v - got; break; default: ret = obj_reloc_unhandled; break; } return ret; } int arch_create_got (struct obj_file *f) { struct s390_file *ifile = (struct s390_file *) f; int i, got_offset = 0, plt_offset = 0, gotneeded = 0; for (i = 0; i < f->header.e_shnum; ++i) { struct obj_section *relsec, *symsec, *strsec; Elf32_Rela *rel, *relend; Elf32_Sym *symtab; const char *strtab; relsec = f->sections[i]; if (relsec->header.sh_type != SHT_RELA) continue; symsec = f->sections[relsec->header.sh_link]; strsec = f->sections[symsec->header.sh_link]; rel = (Elf32_Rela *)relsec->contents; relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela)); symtab = (Elf32_Sym *)symsec->contents; strtab = (const char *)strsec->contents; for (; rel < relend; ++rel) { struct s390_symbol *intsym; struct s390_plt_entry *pe; struct s390_got_entry *ge; switch (ELF32_R_TYPE(rel->r_info)) { /* These four relocations refer to a plt entry. */ case R_390_PLT16DBL: case R_390_PLT32: obj_find_relsym(intsym, f, f, rel, symtab, strtab); assert(intsym); pe = &intsym->pltent; if (!pe->allocated) { pe->allocated = 1; pe->offset = plt_offset; plt_offset += 12; } break; /* The next three don't need got entries but the address of the got itself. */ case R_390_GOTPC: case R_390_GOTOFF: gotneeded = 1; break; case R_390_GOT12: case R_390_GOT16: case R_390_GOT32: obj_find_relsym(intsym, f, f, rel, symtab, strtab); assert(intsym); ge = (struct s390_got_entry *) &intsym->gotent; if (!ge->allocated) { ge->allocated = 1; ge->offset = got_offset; got_offset += sizeof(void*); } break; default: break; } } } if (got_offset > 0 || gotneeded) { struct obj_section *gotsec; struct obj_symbol *gotsym; gotsec = obj_find_section(f, ".got"); if (gotsec == NULL) gotsec = obj_create_alloced_section(f, ".got", 4, got_offset, SHF_WRITE); else obj_extend_section(gotsec, got_offset); gotsym = obj_add_symbol(f, "_GLOBAL_OFFSET_TABLE_", -1, ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), gotsec->idx, 0, 0); gotsym->secidx = gotsec->idx; /* mark the symbol as defined */ ifile->got = gotsec; } if (plt_offset > 0) ifile->plt = obj_create_alloced_section(f, ".plt", 4, plt_offset, SHF_WRITE); return 1; } int arch_init_module (struct obj_file *f, struct module *mod) { return 1; } int arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) { int i, n = f->header.e_shnum; f->baseaddr = base; for (i = 0; i < n; ++i) f->sections[i]->header.sh_addr += base; return 1; } int arch_archdata (struct obj_file *fin, struct obj_section *sec) { return 0; }